찾다
Javajava지도 시간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. 그는 어떻게 하시겠습니까? 정렬할 애플? 그는 우리가 어떤 특성을 비교하기를 원합니까?

  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으로 문의하세요.
带你搞懂Java结构化数据处理开源库SPL带你搞懂Java结构化数据处理开源库SPLMay 24, 2022 pm 01:34 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

Java集合框架之PriorityQueue优先级队列Java集合框架之PriorityQueue优先级队列Jun 09, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

完全掌握Java锁(图文解析)完全掌握Java锁(图文解析)Jun 14, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

一起聊聊Java多线程之线程安全问题一起聊聊Java多线程之线程安全问题Apr 21, 2022 pm 06:17 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

详细解析Java的this和super关键字详细解析Java的this和super关键字Apr 30, 2022 am 09:00 AM

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

Java基础归纳之枚举Java基础归纳之枚举May 26, 2022 am 11:50 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

java中封装是什么java中封装是什么May 16, 2019 pm 06:08 PM

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

归纳整理JAVA装饰器模式(实例详解)归纳整理JAVA装饰器模式(实例详解)May 05, 2022 pm 06:48 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

뜨거운 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경