>  기사  >  Java  >  Java에서 Comparable 및 Comparator를 사용하는 방법

Java에서 Comparable 및 Comparator를 사용하는 방법

WBOY
WBOY앞으로
2023-05-03 10:07:061303검색

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);
	}
}

실행 스크린샷:

Java에서 Comparable 및 Comparator를 사용하는 방법

추가 지침 : list.sort()방법
API 문서의 설명:

지정된 비교기에 의해 유도된 순서에 따라 이 목록을 정렬합니다.
이 목록의 모든 요소는 지정된 비교기를 사용하여 상호 비교할 수 있어야 합니다(즉, c.compare(e1, e2)는 목록의 모든 요소 e1 및 e2에 대해 ClassCastException을 발생시킵니다. 지정된 비교자가 null인 경우 이 목록의 모든 요소는 Comparable 인터페이스를 구현해야 하며 요소의 자연 순서를 사용해야 합니다. 그러나 반드시 그럴 필요는 없습니다. resizing.

이 메서드는 Comparator 개체를 통해 정렬되는 것을 볼 수 있습니다. 들어오는 매개 변수가 null이면 자연 정렬이 수행됩니다. 그러나 참고: 자연 정렬의 전제는 해당 엔터티 클래스가 Comparable 인터페이스를 구현한다는 것입니다. , 그리고 CompareTo() 메서드를 재정의했습니다.

위 내용은 Java에서 Comparable 및 Comparator를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제