>  기사  >  Java  >  Java Comparable 인터페이스의 샘플 코드에 대한 자세한 설명

Java Comparable 인터페이스의 샘플 코드에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-20 11:09:461475검색

이 기사는 클린 코드 원칙에 대한 무료 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. 그는 어떻게 하시겠습니까? 정렬할 애플? 그는 우리가 어떤 특성을 비교하기를 원합니까?

  2. 그런 맥락에서 '보다 작음', '같음', '보다 큼'은 무엇을 의미하나요?

여러 기능을 사용할 수도 있으며 이에 대해서는 나중에 설명하겠습니다.

예 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.