>  기사  >  Java  >  Java에서 Comparator와 Comparator의 차이점

Java에서 Comparator와 Comparator의 차이점

王林
王林앞으로
2019-11-27 13:20:312167검색

Java에서 Comparator와 Comparator의 차이점

Comparable Comparator

Comparable은 java.lang 패키지 아래에 있으며 기본적으로 내부 비교기입니다. Comparable을 구현하는 클래스는 스스로 비교할 수 있습니다. 비교 결과는 자연 비교 메서드인 CompareTo의 구현에 따라 달라집니다.

compare 반환 값은 -1, 0, 1입니다. 비교자가 비교 대상보다 크면 1을 반환하고, 같으면 0을, 비교 대상보다 작으면 -1을 반환합니다.

Collections.sortArrays.sort는 Comparable을 구현하는 객체를 자동으로 정렬할 수 있습니다. Collections.sortArrays.sort 可以自动对实现 Comparable 的对象进行排序。

免费在线学习视频推荐:java学习

示例如下,我们构建一个 node 对象,并通过 node 对象之间的比较验证 Comparable 的用法。

node 对象的实现如下:

public class Node implements Comparable<Object>{
	
	private int num;
	
	private String name;

	@Override
	public String toString() {
		return "num=" + num + " name=" + name;
	}

	public Node(int num, String name) {
		super();
		this.num = num;
		this.name = name;
	}

	public Node() {
		super();
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	@Override
    public int compareTo(Object o) {
		Node node = (Node)o;
        return this.num - node.getNum();
    }
}

可以看到,我们为 Node 实现了 Comparable 接口,并且重写了 compareTo 方法。

先测试一下,我们创建10个 Node 对象并添加进 List 中,然后把顺序打乱。

public class MyTest {

	public static void main(String[] args) {
		List<Node> list = new ArrayList<Node>();
		for(int i = 0;i < 10;i++) {
			list.add(new Node(i,"node"));
		}
		//打乱顺序
		Collections.shuffle(list);
		for (Node node : list) {
			System.out.println(node);
		}
	}
}

显示结果如下:

num=7 name=node
num=0 name=node
num=5 name=node
num=9 name=node
num=6 name=node
num=3 name=node
num=4 name=node
num=8 name=node
num=1 name=node
num=2 name=node

现在输出是乱序的,接下来我们使用 Collections.sort 对其进行排序。

public class MyTest {

	public static void main(String[] args) {
		List<Node> list = new ArrayList<Node>();
		for(int i = 0;i < 10;i++) {
			list.add(new Node(i,"node"));
		}
		//打乱顺序
		Collections.shuffle(list);
		Collections.sort(list);
		for (Node node : list) {
			System.out.println(node);
		}
	}
}

Collections.sort 其实是按 compareTo 方法中的定义进行比较,我们之前定义了按照 num 的升序进行排序,现在排序结果如下:

num=0 name=node
num=1 name=node
num=2 name=node
num=3 name=node
num=4 name=node
num=5 name=node
num=6 name=node
num=7 name=node
num=8 name=node
num=9 name=node

Comparator比较器

Comparator 位于 java.util

무료 온라인 학습 동영상 추천: java learning

# 🎜🎜#

예제는 다음과 같습니다. 노드 객체를 구성하고 노드 객체 간의 비교를 통해 Comparable의 사용법을 확인합니다.

노드 객체의 구현은 다음과 같습니다:

Collections.sort(List<T> list, Comparator<? super T> c);
Arrays.sort(T[] a, Comparator<? super T> c);

보시다시피 우리는 Node에 대한 Comparable 인터페이스를 구현하고 CompareTo 메서드를 재정의했습니다.


먼저 테스트하기 위해 10개의 Node 객체를 생성하고 이를 목록에 추가한 다음 순서를 섞습니다.

public class Node{
	
	private int num;
	
	private String name;

	@Override
	public String toString() {
		return "num=" + num + " name=" + name;
	}

	public Node(int num, String name) {
		super();
		this.num = num;
		this.name = name;
	}

	public Node() {
		super();
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

결과는 다음과 같이 표시됩니다.

public class MyTest {

	public static void main(String[] args) {
		List<Node> list = new ArrayList<Node>();
		for(int i = 0;i < 10;i++) {
			list.add(new Node(i,"node"));
		}
		//打乱顺序
		Collections.shuffle(list);
		
		Collections.sort(list, new Comparator<Node>() {
            @Override
            public int compare(Node o1, Node o2) {
                return o2.getNum()-o1.getNum();
            }
        });
		
		for (Node node : list) {
			System.out.println(node);
		}
	}
}
이제 출력이 잘못되었습니다. 다음으로 Collections.sort를 사용하여 정렬합니다.
num=9 name=node
num=8 name=node
num=7 name=node
num=6 name=node
num=5 name=node
num=4 name=node
num=3 name=node
num=2 name=node
num=1 name=node
num=0 name=node

Collections.sort는 실제로 CompareTo 메서드의 정의에 따라 비교됩니다. 이전에 num의 오름차순으로 정렬을 정의했습니다. 이제 정렬 결과는 다음과 같습니다.

rrreee#🎜🎜 ##🎜 🎜#Comparator

Comparatorjava.util 패키지 아래에 있으며 기본적으로 외부 비교기입니다. 클래스가 내부적으로 Comparable을 구현하지 않거나 Comparable을 구현하지만 비교 방법이 원하는 것이 아닌 경우 Comparator 구현을 고려할 수 있습니다. Comparator 인터페이스에는 Compare 메소드가 있으며, 사용법은 Comparable의 CompareTo와 동일합니다.

정렬 순서를 제어하려면 정렬 메서드에 비교기를 전달해야 합니다. 여러 정렬 방법의 사용법을 확인하고 Comparator 매개변수를 전달할 수 있음을 확인할 수 있습니다. #🎜🎜#rrreee#🎜🎜#이전 Node 객체를 수정하고 더 이상 Comparable을 구현하지 않습니다. #🎜🎜#rrreee#🎜🎜#우리는 비교기를 전달하여 내림차순 정렬을 달성하려고 합니다. #🎜🎜#rrreee#🎜🎜#결과는 다음과 같습니다. #🎜🎜##🎜🎜#rrreee#🎜🎜#Comparator는 역순 비교를 구현합니다. #🎜🎜##🎜🎜##🎜🎜#Summary#🎜🎜##🎜🎜##🎜🎜#Comparable은 내부 비교기이고, Comparator는 외부 비교기입니다. 클래스가 Comparable 인터페이스를 구현하지 않지만 구현해야 하는 경우입니다. 정렬하려면 Comparator 사용을 고려해 볼 수 있습니다. 다른 관점에서 보면 Comparable 인터페이스 사용의 결합은 Comparator의 결합보다 더 큽니다. 왜냐하면 비교 알고리즘을 수정해야 할 때 Comparable의 구현 클래스도 수정해야 하기 때문입니다. #🎜🎜##🎜🎜#이 기사는 #🎜🎜#java빠른 시작#🎜🎜# 칼럼에서 가져온 것입니다. 누구나 함께 토론하고 배울 수 있습니다. #🎜🎜#

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

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