Java Comparable 인터페이스의 샘플 코드에 대한 자세한 설명
이 기사는 클린 코드 원칙에 대한 무료 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

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

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

Spring Boot는 강력하고 확장 가능하며 생산 가능한 Java 응용 프로그램의 생성을 단순화하여 Java 개발에 혁명을 일으킨다. Spring Ecosystem에 내재 된 "구성에 대한 협약"접근 방식은 수동 설정, Allo를 최소화합니다.
