简述Comparator和Collections.sort(),及基于此的Map排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简述Comparator和Collections.sort(),及基于此的Map排序相关的知识,希望对你有一定的参考价值。
参考技术A comparable实现了此接口,a.compare(b),如果a大于b返回1,a小于b返回负数;
comparator实现了
o1>o2返回正数,o1==o2返回0,o1<o2返回负数;
*由于以上两个方法都不是static method所以实现接口时,需要实现接口内方法。
对于Arrays.sort与Collections.sort排序一般用comparator接口,一是易于实现,二是可以用lambda表达式表达。
Arrays.sort一般用于排序数组
Collection.sort一般用于排序列表
实现comparator接口的collection一般用法
稍微高级一点的写法,就是把方法写在Collections.sort()的括号里
再高级一点,用lambda表达式
再高级一点?lambda直接用list里面的sort方法而不用Collection的
很好,我觉得差不多了,关于
这种东西我不会,也不想会,88。
众所周知,HashMap把东西放进去之后啊,顺序就不是原来放入的顺序了,他有自己那一套?具体我也不知道。
所以这里我们要对放入进HashMap的东西排序。
主要分三步
1、首先把HashMap的map变为Set<Entry<E,V>>
2、然后新建列表List<Entry<E,V>>
3、通过Comparator 排序List
这样我们的List就有序啦,再通过iterator的foreach输出即可!
具体实现如下
高级一点的写法。。。。。
Comparable和Comparator
1. Comparable接口
- 在java.lang包下,实现了Comparable函数式接口的对象可以自然排序,而数组和集合实现了该接口,所以我们会用Arrays.sort()或Collections.sort()来排序
Comparable比较大于就返回1,小于返回-1,等于返回0
如果自定义的对象也要排序,就需要实现该接口并且手动重写里面的compareTo()方法
返回值 | 函数名 | 解释 |
---|---|---|
int | compareTo(T o) | 将此对象与指定的对象进行比较以进行排序 |
需要排序的自定义对象
public class User implements Comparable<User>{
private int age;
private String name;
//省略各种Getters、Setters、toString、Constructor
@Override
//重写方法
public int compareTo(User o) {
//根据成绩年龄来排序
if (this.age > o.age) return 1;
if (this.age < o.age) return -1;
return 0;
}
}
测试
public static void main(String[] args) {
//创建泛型集合
ArrayList<User> arrayList = new ArrayList<User>();
//集合添加了四个奇怪名字的User
arrayList.add(new User(100,"Howl"));
arrayList.add(new User(1,"Howlet"));
arrayList.add(new User(50,"晚上没宵夜"));
arrayList.add(new User(7,"云吞面"));
//compareTo方法测试
System.out.println( "compareTo方法测试: " + new User(100,"Howl").compareTo(new User(1,"Howlet")) + "
");
//集合类排序
Collections.sort(arrayList);
//输出排序后集合
Iterator iterator = arrayList.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
输出
compareTo方法测试: 1
User [age=1, name=Howlet]
User [age=7, name=云吞面]
User [age=50, name=晚上没宵夜]
User [age=100, name=Howl]
2. Comparator
- 在java.util包下,实现该接口的对象可以精确控制排序的顺序,还可以将该比较器传递给Collections.sort或Arrays.sort以实现控制顺序
- 实现该接口需要重写里面的compare()方法
返回值 | 函数名 | 解释 |
---|---|---|
int | compare(T o1, T o2) | 比较其两个参数的顺序 |
需要排序的自定义对象
public class UserComparator implements Comparator<User>{
@Override
public int compare(User o1, User o2) {
//逆序
if (o1.getAge() > o2.getAge()) return -1;
if (o1.getAge() < o2.getAge()) return 1;
return 0;
}
}
测试(和上面的一样,只是下面的排序要添加比较器)
//集合类排序
Collections.sort(arrayList,new UserComparator());
输出
compareTo方法测试: -1
User [age=100, name=Howl]
User [age=50, name=晚上没宵夜]
User [age=7, name=云吞面]
User [age=1, name=Howlet]
3. 比较二者
- Comparable实现的是自然排序,是对象内部自己实现的
- Comparator实现定制排序,是对象之外实现的,借助了外力来推动比较
- 二者同时存在则使用Comparator排序
以上是关于简述Comparator和Collections.sort(),及基于此的Map排序的主要内容,如果未能解决你的问题,请参考以下文章
集合工具类Collections指南,以及Comparable和Comparator排序详解
Java—集合框架 Collections.sort()Comparable接口和Comparator接口
Comparable和Comparator比较实现排序 场景分析
Collections.sort排序时,重写Comparator自定义排序报java.lang.AbstractMethodError异常,