이 기사는 클린 코드 원칙에 대한 무료 Java 8 과정의 일부입니다.
이번 글에서는 Java Comparable인터페이스에 대해 이야기해보겠습니다.
여기를 클릭하시면 좋은 동영상도 보실 수 있습니다.
Comparable 인터페이스는 어떤 용도로 사용되나요?
어떻게 비교하고 주문해야 할까요? 이 질문이 다소 혼란스럽게 들릴 수도 있지만, 진지하게 생각해보시길 바랍니다. 예를 들어 사과 그룹이 있습니다.
예 1
어떻게 정렬합니까? 무게별로 정렬해 볼까요? 그렇다면 가장 가벼운 것부터 가장 무거운 것까지, 아니면 가장 무거운 것부터 가장 가벼운 것까지 정렬되어 있습니까? 사과를 정렬할 때 모든 사과가 올바르게 정렬될 때까지 두 사과의 무게를 반복적으로 비교해야 합니다. Apple 1이 Apple 2보다 무겁습니까? 그럼 아이폰3보다 무겁나요? 정렬이 완료될 때까지 계속 비교해야 합니다. Comparable 인터페이스는 이 목표를 달성하는 데 도움이 될 수 있습니다. Comparable 자체는 객체 를 정렬할 수 없지만 인터페이스에 정의된 int CompareTo(T) 메서드는 정렬할 수 있습니다.
CompareTo(T) 작동 방식
CompareTo() 메서드를 사용하여 어떤 사과가 더 무거운지 살펴보겠습니다.
예제 2
CompareTo() 메서드는 int 값(양수, 음수 또는 0)을 반환하여 작동합니다. 객체를 인수로 호출하여 객체를 비교합니다. 음수는 호출되는 객체가 인수보다 "가벼움"을 나타냅니다. 사과를 크기별로 비교하는 경우 빨간색 사과가 녹색 사과보다 작기 때문에 위 호출은 -400과 같은 음수를 반환합니다. 두 사과의 무게가 같으면 호출은 0을 반환합니다. 빨간 사과가 더 무거우면 CompareTo()는 68과 같은 양수를 반환합니다.
CompareTo()의 유연성
위의 CompareTo() 메서드를 반복해서 호출하면 크기별로 정렬할 수 있는데, 이는 훌륭하지만 이야기가 끝나지는 않습니다. 사과를 색깔별로 분류하고 싶다면 어떻게 해야 할까요? 아니면 무게인가요? 우리도 할 수 있습니다. 요점은 우리 클라이언트(그를 Fat Farmer라고 부르겠습니다(예 3 참조))가 개발을 시작하기 전에 사과를 어떻게 분류해야 하는지 정확히 정의해야 한다는 것입니다.
예 3
그는 다음 두 질문에 대답하여 이를 수행할 수 있습니다.
그는 어떻게 하시겠습니까? 정렬할 애플? 그는 우리가 어떤 특성을 비교하기를 원합니까?
그런 맥락에서 '보다 작음', '같음', '보다 큼'은 무엇을 의미하나요?
여러 기능을 사용할 수도 있으며 이에 대해서는 나중에 설명하겠습니다.
예 1: 사과를 무게별로 정렬
이 첫 번째 예에서는 사과를 무게별로 정렬하겠습니다. 필요한 것은 코드 한 줄뿐입니다.
Collections.sort(apples);
예 4
사과를 정렬하는 방법을 미리 정의하기만 하면 위의 코드 줄은 모든 정렬 작업을 수행할 수 있습니다(여러 줄의 코드가 필요함).
사과 카테고리 작성을 시작해 보겠습니다.
public class Apple implements Comparable { private String variety; private Color color; private int weight; @Override public int compareTo(Apple other) { if (this.weight < other.weight) { return -1; } if (this.weight == other.weight) { return 0; } return 1; } }
예제 5
Apple 클래스의 첫 번째 버전입니다. CompareTo 메서드를 사용하고 사과를 정렬하고 있으므로 Comparable 인터페이스를 구현했습니다. 첫 번째 버전에서는 물체를 무게별로 비교합니다. CompareTo() 메서드에서는 이 사과의 무게가 다른 사과보다 작으면 음수를 반환한다는 if 조건을 작성합니다. 이를 간단하게 유지하기 위해 -1이라고 가정합니다. 이는 이 Apple이 Apple '다른' 것보다 가볍다는 것을 의미합니다. 두 번째 if 문에서는 사과의 무게가 같으면 0이 반환된다고 명시하고 있습니다. 물론, 이 사과가 가볍지도, 똑같이 무겁지도 않다면, 그것은 다른 사과들보다 더 무거울 수밖에 없습니다. 이 경우 1로 가정하여 양수를 반환합니다.
例2:通过多个特征排序苹果
正如我前面提到的,我们还可以使用compareTo()比较多个特征。比方说,我们第一通过品种排序苹果,但如果两个苹果是同一品种,那么我们就按颜色排序。最后,如果这两个特性相同,那么我们将按重量排序。虽然我们可以手动实现这件事,就像我在最后一个例子中做的那样,但是其实可以用一种简洁得多的方式实现。一般来说,最好是重用现有的代码,而不是自己写。我们可以在Integer、String和枚举类中使用compareTo方法来比较值。由于我们没有使用Integer对象,用了int,所以我们不得不使用来自于Integer包装器类的一个静态的helper方法来比较两个值。
public class Apple implements Comparable { private String variety; private Color color; private int weight; @Override public int compareTo(Apple other) { int result = this.variety.compareTo(other.variety); if (result != 0) { return result; } if (result == 0) { result = this.color.compareTo(other.color); } if (result != 0) { return result; } if (result == 0) { result = Integer.compare(this.weight, other.weight); } return result; } }
例6
在例6中,我们比较了客户指定的苹果的第一特性,它们的品种。如果compareTo()调用的结果为非零,那么我们返回值。否则,我们调用另一个compareTo()直到得到一个非零值,或者直到已经比较完这三个特征。尽管此代码可以工作,但它不是最有效或干净的解决方案。在例3中,我们重构我们的代码,使其更简单。
@Override public int compareTo(Apple other) { int result = this.variety.compareTo(other.variety); if (result == 0) { result = this.color.compareTo(other.color); } if (result == 0) { result = Integer.compare(this.weight, other.weight); } return result; }
例7
正如你所看到的,这大大减少了代码,并且每一次比较只要一行代码。如果一个compareTo()调用的结果是零,那么我们就转移到下一个相同if语句的比较中。顺便说一句,这是成为Clean Coder的一个很好的例子。通常情况下,你不需要立即写出干净的代码;你可以从一个粗略的想法开始,使其可以工作,然后不断改进,直到你尽可能得让它干净就可以了。
Comparable,hashCode以及Equals
你可能会注意到compareTo()看起来有点像hashCode()和equals()方法。但是,它们有一个重要的区别。对于hashCode()和equals()方法,比较个体属性的顺序不影响返回的值,但是,在compareTo()中,通过你比较对象的顺序来定义对象的顺序。
结论
在结论中我只想强调Comparable接口是多么的重要。它既用于java.util.Arrays,也用于java.util.Collections实用程序类,来排序元素和搜索排序集合中的元素。使用TreeSet和Tree Map,就更简单了——想要它们会自动排序必须实现Comparable接口的元素。
위 내용은 Java Comparable 인터페이스의 샘플 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

이 기사에서는 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 및 Gradle을 사용하여 접근 방식과 최적화 전략을 비교합니다.

이 기사에서는 Maven 및 Gradle과 같은 도구를 사용하여 적절한 버전 및 종속성 관리로 사용자 정의 Java 라이브러리 (JAR Files)를 작성하고 사용하는 것에 대해 설명합니다.

이 기사는 카페인 및 구아바 캐시를 사용하여 자바에서 다단계 캐싱을 구현하여 응용 프로그램 성능을 향상시키는 것에 대해 설명합니다. 구성 및 퇴거 정책 관리 Best Pra와 함께 설정, 통합 및 성능 이점을 다룹니다.

이 기사는 캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA를 사용하는 것에 대해 설명합니다. 잠재적 인 함정을 강조하면서 성능을 최적화하기위한 설정, 엔티티 매핑 및 모범 사례를 다룹니다. [159 문자]

Java의 클래스 로딩에는 부트 스트랩, 확장 및 응용 프로그램 클래스 로더가있는 계층 적 시스템을 사용하여 클래스로드, 링크 및 초기화 클래스가 포함됩니다. 학부모 위임 모델은 핵심 클래스가 먼저로드되어 사용자 정의 클래스 LOA에 영향을 미치도록합니다.

이 기사에서는 분산 응용 프로그램을 구축하기위한 Java의 원격 메소드 호출 (RMI)에 대해 설명합니다. 인터페이스 정의, 구현, 레지스트리 설정 및 클라이언트 측 호출을 자세히 설명하여 네트워크 문제 및 보안과 같은 문제를 해결합니다.

이 기사는 네트워크 통신을위한 Java의 소켓 API, 클라이언트 서버 설정, 데이터 처리 및 리소스 관리, 오류 처리 및 보안과 같은 중요한 고려 사항에 대해 자세히 설명합니다. 또한 성능 최적화 기술, i

이 기사에서는 맞춤형 Java 네트워킹 프로토콜을 작성합니다. 프로토콜 정의 (데이터 구조, 프레임, 오류 처리, 버전화), 구현 (소켓 사용), 데이터 직렬화 및 모범 사례 (효율성, 보안, Mainta를 포함합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

WebStorm Mac 버전
유용한 JavaScript 개발 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
