-
2022-02-14 10:04:43
comparable 接口和 comparator 接口实现比较的区别和用法
1.定义
Comparable 接口:
使用 Array 或 Collection 的排序方法时,自定义类需要实现Java提供 Comparable 接口的 compareTo(TOBJ)方法,它被排序方法所使用,应该重写这个方法,如果“this”对象比传递的对象参数更小、相等或更大时,它返回一个负整数、0 或正整数
Comparator 接口:
可以实现两个对象的特定字段的比较(比如,比较员工这个对象的年龄),该接口的 compare(Objecto1, Object o2)方法的实现需要传递两个对象参数,若第一个参数小于、等于、大于第二个参数,返回负整数、0、正整数
comparable 接口和 comparator 接口区别
- Comparable和Comparator接口被用来对对象集合或者数组进行排序
- Comparable接口被用来提供对象的自然排序,可使用它来提供基于单个逻辑的排序
- Comparator接口被用来提供不同的排序算法,可根据制定字段选择需要使用的Comparator来对指定的对象集合进行排序。
更多相关内容 -
Java中实现Comparator接口和用法实例(简明易懂)
2020-09-03 17:17:21主要介绍了Java中实现Comparator接口和用法实例(简明易懂),本文给出实现Comparator接口的实例和使用这个接口的代码实例,需要的朋友可以参考下 -
详解JAVA使用Comparator接口实现自定义排序
2020-08-26 05:31:39主要介绍了JAVA使用Comparator接口实现自定义排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
浅析Java中comparator接口与Comparable接口的区别
2020-09-01 12:12:26本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧 -
Comparable接口和Comparator接口的比较
2020-12-20 23:16:02Comparable是 排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。 此外,实现此接口的对象可以用作... -
详解Java中Comparable和Comparator接口的区别
2020-08-29 12:00:18主要介绍了详解Java中Comparable和Comparator接口的区别的相关资料,希望通过本文大家能彻底掌握这部分内容,需要的朋友可以参考下 -
Java:Comparator接口
2021-02-27 19:01:33public interface Comparator接口里面的方法intcompare(T o1, T o2)o1> o2 返回 1o1= o2 返回 0o1< o2 返回 -1booleanequals(Object obj)判断是否相等其他方法:...public interface Comparator
接口里面的方法
intcompare(T o1, T o2)
o1> o2 返回 1o1= o2 返回 0o1< o2 返回 -1
booleanequals(Object obj)
判断是否相等
其他方法:https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。
将数组中偶数排的后面
实现Comparator接口
class myComparator implements Comparator{public intcompare(Integer a,Integer b){return a%2==0?1:-1;
}
}
Comparator 传递给 sort 方法
packagearrays1;importjava.util.Arrays;importjava.util.Comparator;class myComparator implements Comparator{public intcompare(Integer a,Integer b){return a%2==0?1:-1;
}
}public classmyArray {public voidmySort(){
Integer[] A= new Integer[]{2,0,345,234,12,34,23};
System.out.println(Arrays.toString(A));
Arrays.sort(A,newmyComparator());
System.out.println(Arrays.toString(A));
}public static voidmain(String[] args){newmyArray().mySort();
}
}
输出结果:
[2, 0, 345, 234, 12, 34, 23]
[23, 345, 2, 0, 234, 12, 34]
上面传递的是一个实例类对象
我们可以根据上节讲的内部类实现
packagearrays1;importjava.util.Arrays;importjava.util.Comparator;public classmyArray {class innerComparator implements Comparator{public intcompare(Integer a,Integer b){return a%2==0?1:-1;}
}public voidmySort(){
Integer[] A= new Integer[]{2,0,345,234,12,34,23};
System.out.println(Arrays.toString(A));
Arrays.sort(A,newinnerComparator());
System.out.println(Arrays.toString(A));
}public static voidmain(String[] args){newmyArray().mySort();
}
}
上面是成员内部类
也可以讲内部类写在方法中,
packagearrays1;importjava.util.Arrays;importjava.util.Comparator;public classmyArray {public voidmySort(){
Integer[] A= new Integer[]{2,0,345,234,12,34,23};
System.out.println(Arrays.toString(A));
Arrays.sort(A,new Comparator(){public intcompare(Integer a,Integer b){return a%2==0?1:-1;
}
});
System.out.println(Arrays.toString(A));
}public static voidmain(String[] args){newmyArray().mySort();
}
}
上面输出结果都一样
上面全部程序
packagearrays1;importjava.util.Arrays;importjava.util.Comparator;class myComparator implements Comparator{public intcompare(Integer a,Integer b){return a%2==0?1:-1;
}
}public classmyArray {class innerComparator implements Comparator{public intcompare(Integer a,Integer b){return b -a;
}
}public voidmySort(){
Integer[] A= new Integer[]{2,0,345,234,12,34,23};
System.out.println(Arrays.toString(A));//Arrays.sort(A,new myComparator());//
//System.out.println(Arrays.toString(A));//Arrays.sort(A,new innerComparator());//
//System.out.println(Arrays.toString(A));
Arrays.sort(A,new Comparator(){public intcompare(Integer a,Integer b){return a%2==0?1:-1;
}
});
System.out.println(Arrays.toString(A));
}public static voidmain(String[] args){newmyArray().mySort();
}
}
View Code
对人按照年龄排序
定义People类
classPeople{intsex;intage;
String name;
People(int sex,intage,String name){this.sex =sex;this.age =age;this.name =name;
}public void setSex(intsex){this.sex =sex;
}public void setAge(intage){this.age =age;
}public voidsetName(String name){this.name =name;
}public intgetSex() {returnsex;
}public intgetAge() {returnage;
}publicString getName() {returnname;
}publicString toString(){
String p= "sex: "+sex+" age: "+ age+" name: "+ name+"\n";returnp;
}
}
View Code
实现Comparator接口,按照年龄排序,这里通过内部类实现的
public classmyArray {class innerComparatorAge implements Comparator{public int compare(People a,People b){ //按照年龄升序
return a.age -b.age;
}
}public voidmySort(){int N = 10;
People[] A= newPeople[N];
Random rand= newRandom();for(int i = 0;i< N;i++){int sex = rand.nextInt(2);int age = 10+ rand.nextInt(40);
String name= ""+rand.nextInt(2000);
A[i]= newPeople(sex,age,name);
}
System.out.println(Arrays.toString(A));
System.out.println("排序后:");
Arrays.sort(A,newinnerComparatorAge());
System.out.println(Arrays.toString(A));
}public static voidmain(String[] args){newmyArray().mySort();
}
}
输出
[sex: 0 age: 23 name: 1067, sex:0 age: 16 name: 416, sex:1 age: 37 name: 465, sex:0 age: 13 name: 1667, sex:0 age: 46 name: 1698, sex:0 age: 13 name: 528, sex:1 age: 21 name: 1558, sex:0 age: 18 name: 1386, sex:1 age: 49 name: 249, sex:1 age: 34 name: 178]
排序后:
[sex:0 age: 13 name: 1667, sex:0 age: 13 name: 528, sex:0 age: 16 name: 416, sex:0 age: 18 name: 1386, sex:1 age: 21 name: 1558, sex:0 age: 23 name: 1067, sex:1 age: 34 name: 178, sex:1 age: 37 name: 465, sex:0 age: 46 name: 1698, sex:1 age: 49 name: 249]
当然也可以修改按照其他方式排序
按照性别排序,当性别相同的时候按照年龄排序
class innerComparatorSexAge implements Comparator{public intcompare(People a,People b){if(a.sex >b.sex)return 1;else if(a.sex
return a.age -b.age;
}
}
输出
[sex: 0 age: 43 name: 1284, sex:1 age: 11 name: 141, sex:0 age: 36 name: 1217, sex:0 age: 12 name: 1804, sex:0 age: 32 name: 1943, sex:0 age: 19 name: 1670, sex:1 age: 49 name: 656, sex:0 age: 36 name: 1349, sex:1 age: 13 name: 1542, sex:0 age: 18 name: 612]
排序后:
[sex:0 age: 12 name: 1804, sex:0 age: 18 name: 612, sex:0 age: 19 name: 1670, sex:0 age: 32 name: 1943, sex:0 age: 36 name: 1217, sex:0 age: 36 name: 1349, sex:0 age: 43 name: 1284, sex:1 age: 11 name: 141, sex:1 age: 13 name: 1542, sex:1 age: 49 name: 656]
实现Comparator 对Arrays , ArrayList , TreeSet ,TreeMap ,HashMap 排序
注意:对Map排序需要新建一个Map,将为排序的Map元素放入到新的Map中,这里是通过Key进行排序的
ArrayList
//Collections.sort
List list = new ArrayList();
Collections.sort(list,new Comparator() {public intcompare(ObjectName o1, ObjectName o2) {returno1.toString().compareTo(o2.toString());
}
});
Arrays
//Arrays.sort
ObjectName[] arr = new ObjectName[10];
Arrays.sort(arr,new Comparator() {public intcompare(ObjectName o1, ObjectName o2) {returno1.toString().compareTo(o2.toString());
}
});
TreeSet
//TreeSet
Set sortedSet = new TreeSet(new Comparator() {public intcompare(ObjectName o1, ObjectName o2) {returno1.toString().compareTo(o2.toString());
}
});
sortedSet.addAll(unsortedSet);
TreeMap
//TreeMap - using String.CASE_INSENSITIVE_ORDER which is a Comparator that orders Strings by compareToIgnoreCase
Map sortedMap = new TreeMap(String.CASE_INSENSITIVE_ORDER);
sortedMap.putAll(unsortedMap);
//TreeMap - In general, defined comparator
Map sortedMap = new TreeMap(new Comparator() {public intcompare(ObjectName o1, ObjectName o2) {returno1.toString().compareTo(o2.toString());
}
});
sortedMap.putAll(unsortedMap);
给个题目:
-
Comparable 接口和 Comparator 接口的区别
2021-06-09 09:36:271. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的实体类比较大小的, 当我们有这么一个personList,里面包含了 person1, person2, persion3…, 我们用Collections.sort( ...1. Comparator 和 Comparable 相同的地方
他们都是java的一个接口, 并且是用来对自定义的实体类比较大小的,
当我们有这么一个personList,里面包含了 person1, person2, persion3…, 我们用Collections.sort( personList ), 是得不到预期的结果的. 这时肯定有人要问, 那为什么可以排序一个字符串list呢:
如 StringList {“hello1” , “hello3” , “hello2”}, Collections.sort( stringList ) 能够得到正确的排序, 那是因为 String 这个对象已经帮我们实现了 Comparable 接口 , 所以我们的 Person 如果想排序, 也要实现一个比较器。2. Comparator 和 Comparable 的区别
Comparable 接口
Comparable 定义在 Person类的内部:
public class Persion implements Comparable { ... 比较Person的大小 ... }
因为已经实现了比较器,那么我们的Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList) 可以得到正确的结果。
Comparator 接口
Comparator 是定义在Person的外部的, 此时我们的Person类的结构不需要有任何变化,如
public class Person { private String name; private int age; }
然后我们另外定义一个比较器:
public class PersonComparator implements Comparator { ... 比较Person的大小 ... }
在 PersonComparator 里面实现了怎么比较两个Person的大小. 所以,用这种方法,当我们要对一个 personList进行排序的时候, 我们除了要传递personList过去, 还需要把 PersonComparator 传递过去,因为怎么比较Person的大小是在PersonComparator 里面实现的, 如:
Collections.sort( personList , new PersonComparator());
3. Comparator 和 Comparable 的实例
package mytest; import java.util.*; /** * @ _ooOoo_ * o8888888o * 88" . "88 * (| -_- |) * O\ = /O * ____/`---'\____ * .' \\| |// `. * / \\||| : |||// \ * / _||||| -:- |||||- \ * | | \\\ - /// | | * | \_| ''\---/'' | | * \ .-\__ `-` ___/-. / * ___`. .' /--.--\ `. . __ * ."" '< `.___\_<|>_/___.' >'"". * | | : `- \`.;`\ _ /`;.`/ - ` : | | * \ \ `-. \_ __\ /__ _/ .-` / / * ======`-.____`-.___\_____/___.-`____.-'====== * `=---=' * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * 佛祖保佑 永无BUG */ public class LearnCompare { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); list.add(new Node("yguo", 25)); list.add(new Node("msdfj", 22)); list.add(new Node("skf", 20)); list.add(new Node("sfe", 23)); System.out.println("===Age排序外部比较器==="); Collections.sort(list, new Comparator<Node>() { @Override public int compare(Node o1, Node o2) { return o1.getAge() - o2.getAge(); } }); for (Iterator<Node> it = list.iterator(); it.hasNext(); ) { System.out.println(it.next()); } System.out.println("===Name排序外部比较器===="); Collections.sort(list, new Comparator<Node>() { @Override public int compare(Node o1, Node o2) { return o1.getName().compareTo(o2.getName()); } }); for (Iterator<Node> it = list.iterator(); it.hasNext(); ) { System.out.println(it.next()); } System.out.println("===Age排序 内部比较器==="); Collections.sort(list); for (Iterator<Node> it = list.iterator(); it.hasNext(); ) { System.out.println(it.next()); } } } // class Node implements Comparable<Node> { private String name; private int age; public Node(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 int compareTo(Node other) { if (age > other.getAge()) return -1; if (age < other.getAge()) return 1; return 0; } @Override public String toString() { return "Name " + name + " age " + age; } }
Comparable:
实现Comparable接口要覆盖compareTo方法, 在compareTo方法里面实现比较:
public class Person implements Comparable { private String name; private int age public int compareTo(Person another) { int i = 0; i = name.compareTo(another.name); // 使用字符串的比较 if(i == 0) { // 如果名字一样,比较年龄, 返回比较年龄结果 return age - another.age; } else { return i; // 名字不一样, 返回比较名字的结果. } } }
这时我们可以直接用 Collections.sort( personList ) 对其排序了.
Comparator:
实现Comparator需要覆盖 compare 方法:
public class Person{ private String name; private int age; } class PersonComparator implements Comparator { public int compare(Person one, Person another) { int i = 0; i = one.name.compareTo(another.name); // 使用字符串的比较 if(i == 0) { // 如果名字一样,比较年龄,返回比较年龄结果 return one.age - another.age; } else { return i; // 名字不一样, 返回比较名字的结果. } } }
Collections.sort( personList , new PersonComparator()) 可以对其排序
4. 总结
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义
的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。 -
Java的Comparator接口和Comparable接口
2021-09-13 12:17:44Java的Comparator接口和Comparable接口 1、Comparator接口 Comparator可以比较的对象类型,是比较接口。我们如果需要控制某个类的次序,而该类本身不支持排 序(即没有实现Comparable接口),那么我们就可以建立一个...Java的Comparator接口和Comparable接口
1、Comparator接口
Comparator可以比较的对象类型,是比较接口。我们如果需要控制某个类的次序,而该类本身不支持排
序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排
序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现
Comparator来新建一个比较器,然后通过这个比较器对类进行排序。
说明:
若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
int compare(T o1, T o2) 是“比较o1和o2的大小”,其中o1指的就是第一个要比较的对象, o2指的就是第二要比的对象。 比较之后会根据大小返回值。 返回“负数”, 意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2。
不重写 Object.equals(Object) 方法总是安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。
总结:
写一个类实现Comparator接口
实现其中的compare方法,有两个泛型的参数(T o1,T o2),其返回值是整形,分为三种数字,大于0、0、小于0
o1 - o2 表示升序,o2-o1表示降序
使用:
// 集合 Collections.sort(List<T> list, Comparator<? super T> c) // 数组 Arrays.sort(T[] a, Comparator<? super T> c)
2、Comparable接口
示例
public class Person implements Comparable{ private Integer age; private String name; public Person(int age,String name) { this.age = age; this.name = name; } @Override public String toString() { return "Person [age=" + age + ", name=" + name + "]"; } //进行方法重写 @Override public int compareTo(Object o) { Person p = (Person)o; return this.age - p.age; } }
对象实现这个Comparable接口,重写compareTo方法,实现自定义属性比较
使用:针对实现了这个类的数组或者集合
集合 Collections.sort(List<T> list) 数组 Arrays.sort(T[] a)
-
常用类和接口之Comparator接口的使用
2022-03-07 20:23:22使用Comparator接口 问题背景: 小编在日常开发中遇到一个问题:就是如何在含有实体类的泛型数组中对对象关键属性作为依据进行排列? 经过查到资料了解到Comparator接口可以实现改功能 Comparator可以比较... -
Comparator接口
2021-01-09 17:24:43java.utils包下的Comparator接口。 该接口代表一个比较器,java数组工具类和集合工具类中提供对sort方法排序就是使用Comparator接口来处理排序的。 Comparator接口中有一个方法 int compare(T o1, T o2) 这个方法... -
comparator接口和Comparable接口比较
2020-06-02 12:51:58一、comparator接口 1、list的比较 2、数组的比较 二、Comparable接口 Java提供了一个用于比较的接口Comparator和Comparable接口,提供了一个比较的方法,所有实现该接口的类,都动态的实现了该比较方法。 一、... -
java的Comparator接口
2021-10-12 15:42:19位于java.util 包下接口 Comparator< T > 其中 T为需要比较的参数,可以将 Comparator 传递给 sort 方法,从而允许在排序顺序上实现精确控制 方法为 int compare(T o1, T o2) , 比较用来排序的两个参数。 ... -
java基础之Comparator接口的使用
2021-11-12 13:33:05java基础之Comparator接口的使用新建测试类使用场景Arrays.sort方法Collections.sort方法Comparator.comparing(City::getName)源码出现空值时报空指针异常Comparator.nullsLast(String::compareTo)将空值放到最后... -
Comparator接口实现定制排序
2022-02-28 14:30:20Comparator接口的使用:定制排序 重写compare(obj o1,obj o2)方法 如果方法返回为正,表示o1>o2 如果方法返回为负,表示o1<o2 如果方法返回为零,表示o1=o2 Comparable接口的方式一旦指定,保证... -
Comparator接口的使用
2020-06-24 23:03:311.Comparator接口的使用 今天学习了java.utils包下的Comparator接口。该接口代表一个比较器。 提到比较的接口, 你一定会想起来Comparable。这个俩个接口都有比较的作用。 提到了comparable接口, 就要介绍一下这两... -
利用Comparator接口实现自定义排序-------Comparator的初了解及初体验
2022-03-16 15:05:19排序往往很头疼,排序的方法,采用什么语句,既费时,又费力,往往还吃力不讨好,且很多时候,我们无法自定义排序的方式,下面我将介绍如何使用Comparator接口中compare方法,并借助Arrays类下的so. -
comparator接口与Comparable接口的区别
2016-07-13 19:40:23comparator接口与Comparable接口的区别 -
java compareTo 方法 和 Comparator 接口
2022-03-14 20:31:52compareTo 方法是接口 Comparable 的实现 返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的长度差值,如果第一个字符和参数的第一个字符相等... -
JAVA Comparator接口和Comparator接口
2019-04-18 17:17:36java的比较器有两类,分别是Comparable接口和Comparator接口。 在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口。 让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法... -
一句话概括Comparator接口实现原理
2022-03-31 22:39:10在需要给特定的集合或者我们自己创建的java类实现排序功能的时候可能会用到最多的就是util包下面的Comparator接口和lang包下的Comparable接口,这两个接口的区别就不细说了,一般会看到说外部排序实现和内部排序实现... -
用Comparator接口进行排序 --java
2021-05-13 18:38:48(01) 若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。 为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals... -
【java】comparator接口与Comparable接口的区别
2021-04-23 18:56:09Comparator 和 Comparable都是java的一个接口, 并且是用来对自定义的class比较大小的。 2. Comparable Comparable 定义在 Person类的内部,子类需要实现compareTo()方法: public class Person implements ... -
java的Comparator接口详解
2019-07-01 13:52:43实际上Java中除了比较一个接口外,还提供了一个接口,该接口也是具有比较的功能,但该接口注重的却是比较容器,然后对其排序,这就是Comparator,下面我们就来具体认识一下; 首先看一下源码: package java.util... -
【java基础】Comparable与Comparator接口
2021-05-24 14:33:14在使用Collections#sort方法对集合进行排序的时候可能并不是很清楚到底是默认的排序规则、自定义排序规则、自定义排序器等等,那么Comparable与Comparator接口到底是有什么区别?该如何使用? Comparable接口(内部... -
java 关于实现comparator接口
2021-02-26 11:31:16代码如下:importjava....importjava.util.Comparator;classPoint{privateintx;privateinty;publicPoint(int_x,int_y){x=_x;y=_y;}publicintgetX(){returnx;}publicintgetY()...代码如下:import java.util.Arrays;im... -
源码详解 Comparable 和 Comparator 接口, compareTo 方法和 compare 方法的区别和使用
2022-02-07 22:19:46源码详解搞懂关于 Collections 工具类中 sort 方法对集合中元素的排序的一些问题, Comparable 和 Comparator 接口, compareTo 方法和 compare 方法的区别和使用 -
Java中的Comparable接口、Comparator接口与CompareTo方法
2021-08-12 23:16:31Java集合中的Comparable接口和Comparator接口的区别 Comparable接口 Comparable简介 Comparable接口位于java.lang.Comparable,如果一个类实现了Comparable接口,就说明这个类是支持排序的,那在实现Comparable... -
Java中Comparator接口与Comparable接口的区别
2021-01-21 17:10:111. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Person{ String name; int age }. 当我们有这么一个...