Comparable Comparator
Comparable은 java.lang 패키지 아래에 있으며 기본적으로 내부 비교기입니다. Comparable을 구현하는 클래스는 스스로 비교할 수 있습니다. 비교 결과는 자연 비교 메서드인 CompareTo의 구현에 따라 달라집니다.
compare 반환 값은 -1, 0, 1입니다. 비교자가 비교 대상보다 크면 1을 반환하고, 같으면 0을, 비교 대상보다 작으면 -1을 반환합니다.
Collections.sort
및 Arrays.sort
는 Comparable을 구현하는 객체를 자동으로 정렬할 수 있습니다. Collections.sort
和 Arrays.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
# 🎜🎜#
예제는 다음과 같습니다. 노드 객체를 구성하고 노드 객체 간의 비교를 통해 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=nodeCollections.sort는 실제로 CompareTo 메서드의 정의에 따라 비교됩니다. 이전에 num의 오름차순으로 정렬을 정의했습니다. 이제 정렬 결과는 다음과 같습니다.
rrreee#🎜🎜 ##🎜 🎜#Comparator
정렬 순서를 제어하려면 정렬 메서드에 비교기를 전달해야 합니다. 여러 정렬 방법의 사용법을 확인하고 Comparator 매개변수를 전달할 수 있음을 확인할 수 있습니다. #🎜🎜#rrreee#🎜🎜#이전 Node 객체를 수정하고 더 이상 Comparable을 구현하지 않습니다. #🎜🎜#rrreee#🎜🎜#우리는 비교기를 전달하여 내림차순 정렬을 달성하려고 합니다. #🎜🎜#rrreee#🎜🎜#결과는 다음과 같습니다. #🎜🎜##🎜🎜#rrreee#🎜🎜#Comparator는 역순 비교를 구현합니다. #🎜🎜##🎜🎜##🎜🎜#Summary#🎜🎜##🎜🎜##🎜🎜#Comparable은 내부 비교기이고, Comparator는 외부 비교기입니다. 클래스가 Comparable 인터페이스를 구현하지 않지만 구현해야 하는 경우입니다. 정렬하려면 Comparator 사용을 고려해 볼 수 있습니다. 다른 관점에서 보면 Comparable 인터페이스 사용의 결합은 Comparator의 결합보다 더 큽니다. 왜냐하면 비교 알고리즘을 수정해야 할 때 Comparable의 구현 클래스도 수정해야 하기 때문입니다. #🎜🎜##🎜🎜#이 기사는 #🎜🎜#java빠른 시작#🎜🎜# 칼럼에서 가져온 것입니다. 누구나 함께 토론하고 배울 수 있습니다. #🎜🎜#위 내용은 Java에서 Comparator와 Comparator의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!