Comparable和Comparator之间的区别

本文概述

  • Java可比示例
  • Java比较器示例
Comparable和Comparator都是接口, 可用于对集合元素进行排序。
但是, 下面给出的Comparable和Comparator接口之间有许多差异。
可比 比较器
1)可比性提供单个排序序列。换句话说, 我们可以根据单个元素(例如id, 名称和价格)对集合进行排序。 比较器提供了多个排序序列。换句话说, 我们可以根据ID, 名称和价格等多个元素对集合进行排序。
2)可比会影响原始类别, 即实际类别会被修改。 比较器不会影响原始类, 即, 实际类不会被修改。
3)Comparable提供compareTo()方法对元素进行排序。 比较器提供compare()方法对元素进行排序。
4)java.lang软件包中存在Comparable。 java.util软件包中提供了一个比较器。
5)我们可以通过Collections.sort(List)方法对Comparable类型的列表元素进行排序。 我们可以通过Collections.sort(List, Comparator)方法对Comparator类型的列表元素进行排序。
Java可比示例让我们看一个Comparable接口的示例, 该接口根据年龄对列表元素进行排序。
文件:TestSort3.java
//Java Program to demonstrate the use of Java Comparable. //Creating a class which implements Comparable Interface import java.util.*; import java.io.*; class Student implements Comparable< Student> { int rollno; String name; int age; Student(int rollno, String name, int age){ this.rollno=rollno; this.name=name; this.age=age; } public int compareTo(Student st){ if(age==st.age) return 0; else if(age> st.age) return 1; else return -1; } } //Creating a test class to sort the elements public class TestSort3{ public static void main(String args[]){ ArrayList< Student> al=new ArrayList< Student> (); al.add(new Student(101, "Vijay", 23)); al.add(new Student(106, "Ajay", 27)); al.add(new Student(105, "Jai", 21)); Collections.sort(al); for(Student st:al){ System.out.println(st.rollno+" "+st.name+" "+st.age); } } }

立即测试
输出:
105 Jai 21 101 Vijay 23 106 Ajay 27

Java比较器示例让我们看一下Java Comparator接口的示例, 其中我们使用不同的比较器对列表中的元素进行排序。
Student.java
class Student{ int rollno; String name; int age; Student(int rollno, String name, int age){ this.rollno=rollno; this.name=name; this.age=age; } }

AgeComparator.java
import java.util.*; class AgeComparator implements Comparator< Student> { public int compare(Student s1, Student s2){ if(s1.age==s2.age) return 0; else if(s1.age> s2.age) return 1; else return -1; } }

NameComparator.java
【Comparable和Comparator之间的区别】此类提供基于名称的比较逻辑。在这种情况下, 我们使用String类的compareTo()方法, 该方法在内部提供比较逻辑。
import java.util.*; class NameComparator implements Comparator< Student> { public int compare(Student s1, Student s2){ return s1.name.compareTo(s2.name); } }

TestComparator.java
在此类中, 我们将根据名称和年龄进行排序, 以打印对象的值。
//Java Program to demonstrate the use of Java Comparator import java.util.*; import java.io.*; class TestComparator{ public static void main(String args[]){ //Creating a list of students ArrayList< Student> al=new ArrayList< Student> (); al.add(new Student(101, "Vijay", 23)); al.add(new Student(106, "Ajay", 27)); al.add(new Student(105, "Jai", 21)); System.out.println("Sorting by Name"); //Using NameComparator to sort the elements Collections.sort(al, new NameComparator()); //Traversing the elements of list for(Student st: al){ System.out.println(st.rollno+" "+st.name+" "+st.age); }System.out.println("sorting by Age"); //Using AgeComparator to sort the elements Collections.sort(al, new AgeComparator()); //Travering the list again for(Student st: al){ System.out.println(st.rollno+" "+st.name+" "+st.age); }} }

输出:
Sorting by Name 106 Ajay 27 105 Jai 21 101 Vijay 23Sorting by Age 105 Jai 21 101 Vijay 23 106 Ajay 27

    推荐阅读