Comparable 및 Comparator는 두 가지 Java 정렬 관련 인터페이스로, 자연 정렬 및 사용자 정의 정렬이라고도 합니다. 최근 관련 내용을 읽었으며, 이제 아래에 나만의 학습 현황을 기록하겠습니다.
Comparable과 Comparator는 정렬에 관한 두 가지 인터페이스로, Java 컬렉션에서 정렬 기능을 구현하는 데 사용됩니다. 특정 기능은 API에서 얻을 수 있습니다.
다음은 API 문서의 간략한 소개입니다.
이 인터페이스는 이를 구현하는 각 클래스의 개체에 전체 순서를 적용합니다. 이 순서를 클래스의 자연 순서라고 합니다. s CompareTo 메서드는 자연 비교 메서드라고 합니다. 이 개체를 지정된 개체와 비교하여 이 개체가 지정된 개체보다 작거나 같거나 크므로 음의 정수, 0 또는 양의 정수를 반환합니다.
사용법:
정렬 엔터티 클래스의 Comparable 인터페이스를 구현하고 정렬 기능을 사용하려면 CompareTo() 메서드를 재정의해야 합니다. 요소를 자동으로 정렬하는 일부 컬렉션(예: TreeSet)은 요소가 컬렉션에 포함될 때 정렬을 위해 CompareTo() 메서드를 자동으로 호출합니다(요소가 이 인터페이스를 구현해야 하는 경우). 하지만 TreeSet에만 국한되지 않고 다른 곳에서도 사용할 수 있어 널리 사용되고 있습니다.
다음은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!