Java에서 Comparable 및 Comparator를 사용하는 방법
Comparable 및 Comparator
Comparable 및 Comparator는 두 가지 Java 정렬 관련 인터페이스로, 자연 정렬 및 사용자 정의 정렬이라고도 합니다. 최근 관련 내용을 읽었으며, 이제 아래에 나만의 학습 현황을 기록하겠습니다.
Comparable과 Comparator는 정렬에 관한 두 가지 인터페이스로, Java 컬렉션에서 정렬 기능을 구현하는 데 사용됩니다. 특정 기능은 API에서 얻을 수 있습니다.
Comparable
다음은 API 문서의 간략한 소개입니다.
이 인터페이스는 이를 구현하는 각 클래스의 개체에 전체 순서를 적용합니다. 이 순서를 클래스의 자연 순서라고 합니다. s CompareTo 메서드는 자연 비교 메서드라고 합니다. 이 개체를 지정된 개체와 비교하여 이 개체가 지정된 개체보다 작거나 같거나 크므로 음의 정수, 0 또는 양의 정수를 반환합니다.
사용법:
정렬 엔터티 클래스의 Comparable 인터페이스를 구현하고 정렬 기능을 사용하려면 CompareTo() 메서드를 재정의해야 합니다. 요소를 자동으로 정렬하는 일부 컬렉션(예: TreeSet)은 요소가 컬렉션에 포함될 때 정렬을 위해 CompareTo() 메서드를 자동으로 호출합니다(요소가 이 인터페이스를 구현해야 하는 경우). 하지만 TreeSet에만 국한되지 않고 다른 곳에서도 사용할 수 있어 널리 사용되고 있습니다.
Comparator
다음은 API 문서의 간략한 소개입니다.
일부 객체 컬렉션에 전체 순서를 적용하는 비교 함수는 정렬 메서드(예: Collections.sort 또는 Arrays)에 전달될 수 있습니다. .sort)을 사용하면 정렬 순서를 정밀하게 제어할 수 있습니다. 비교기는 특정 데이터 구조(예: 정렬된 세트 또는 정렬된 맵)의 순서를 제어하거나 정렬 순서가 없는 개체 컬렉션에 대한 순서를 제공하는 데 사용할 수도 있습니다. 자연스러운 순서입니다.
사용법:
Comparator는 타사 인터페이스입니다. 구체적인 사용법은 비교기를 설계하고, 클래스를 만들고, 이 인터페이스를 구현하고, Compare() 메서드를 재정의하는 것입니다. 그리고 Comparator는 기능적 인터페이스이므로 Comparator 객체 대신 Lambda 표현식을 사용할 수 있어 코드가 더욱 간결하고 명확해집니다.
톡은 저렴해요, 코드 보여주세요
참고: 블로그 내용은 그다지 자세하지 않을 수 있으니, 구체적인 내용을 보시려면 주로 책이나 공식 문서를 읽어보시면 됩니다. more 기본 사용법을 간략하게 소개합니다.
테스트 엔터티 클래스: Dog
public class Dog implements Comparable<Dog>{ private String name; private int age; public Dog(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Dog [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Dog dog) { return this.age > dog.age ? 1 : this.age < dog.age ? -1 : 0; } }
테스트 엔터티 클래스: Cat
public class Cat implements Comparable<Cat>{ private String name; private Integer age; public Cat(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Cat [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Cat o) { //可以直接调用,这样更简单 //调换 o.age 和 this.age 就是相反的顺序 return o.age.compareTo(this.age); } }
테스트 클래스: Test
public class Test { public static void main(String[] args) { List<Dog> dogs = new LinkedList<>(); List<Cat> cats = new LinkedList<>(); dogs.add(new Dog("大黄",6)); dogs.add(new Dog("大白",1)); dogs.add(new Dog("小黑",5)); dogs.add(new Dog("旺财",3)); dogs.add(new Dog("二哈",2)); cats.add(new Cat("牛牛",3)); cats.add(new Cat("花咪",4)); cats.add(new Cat("咪咪",10)); cats.add(new Cat("小黄",2)); cats.add(new Cat("大橘",6)); //参数为 null 使用 自然排序,否则使用 定制排序 //也可以看出来 定制排序 优先级高于 自然排序 System.out.println("---------自然排序 升序--------"); dogs.sort(null); dogs.forEach(System.out::println); System.out.println("---------自然排序 降序--------"); cats.sort(null); cats.forEach(System.out::println); //定制排序 //Comparator<Dog> c = (e1,e2)->e2.getAge() - e1.getAge(); //dogs.sort(c) 这个就是下面这个的具体形式, //可以看出来参数是一个 Comparator 对象 System.out.println("---------定制排序 降序--------"); dogs.sort((e1,e2)->e2.getAge() - e1.getAge()); //流式API的简单的应用,效果和上面的类似,或者直接使用 forEacn 循环遍历 dogs.stream().forEach(System.out::println); System.out.println("---------定制排序 升序--------"); // 另一种遍历方式,可以看出来函数式编程非常灵活,我也是初学,觉得很神奇。 cats.stream() .sorted((e1,e2)->e1.getAge()-e2.getAge()) .forEach(System.out::println); } }
실행 스크린샷:
추가 지침 : list.sort()
방법
API 문서의 설명:
지정된 비교기에 의해 유도된 순서에 따라 이 목록을 정렬합니다.
이 목록의 모든 요소는 지정된 비교기를 사용하여 상호 비교할 수 있어야 합니다(즉, c.compare(e1, e2)는 목록의 모든 요소 e1 및 e2에 대해 ClassCastException을 발생시킵니다. 지정된 비교자가 null인 경우 이 목록의 모든 요소는 Comparable 인터페이스를 구현해야 하며 요소의 자연 순서를 사용해야 합니다. 그러나 반드시 그럴 필요는 없습니다. resizing.
이 메서드는 Comparator 개체를 통해 정렬되는 것을 볼 수 있습니다. 들어오는 매개 변수가 null이면 자연 정렬이 수행됩니다. 그러나 참고: 자연 정렬의 전제는 해당 엔터티 클래스가 Comparable 인터페이스를 구현한다는 것입니다. , 그리고 CompareTo() 메서드를 재정의했습니다.
위 내용은 Java에서 Comparable 및 Comparator를 사용하는 방법의 상세 내용입니다. 자세한 내용은 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의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

자바의 암스트롱 번호 안내 여기에서는 일부 코드와 함께 Java의 Armstrong 번호에 대한 소개를 논의합니다.

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

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

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

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