Comparable api 解读
该接口给每个对象进行自然排序,它的compareTo 方法就是自然排序的方法。
实现该接口,只是说明该对象可以比较。
如果一个对象实现了该接口,也就意味着可以通过Collections.sort and Arrays.sort 等排序方法进行排序。
实现该接口,必须实现compareTo,实现具体比较逻辑。
package com.example.test;
public class People implements Comparable<People> {
private String name;
private int age;
public People(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(People o) {
// TODO Auto-generated method stub
return o.age-age;
}
}
javabean对象,必须实现Comparable接口,才可以比较,不能调用sort报错。
static List<People> list = new ArrayList<>();
public static void main(String[] args) {
list.add(new People("liu", 23));
list.add(new People("liu2", 24));
list.add(new People("liu3e", 33));
list.add(new People("liu4", 13));
list.add(new People("liu5", 22));
Collections.sort(list);
for(int i =0;i<list.size();i++) {
System.out.println(list.get(i).getAge());
}
}
Comparator api解读
强行对某个对象 collection 进行整体排序 的比较函数,它可以实现排列顺序精确控制,或者为那些没有自然顺序的对象 collection 提供排序。(也就是没有实现Comparerable接口)
Comparator 的功能更强大。
将上述的javbean对象,不去实现Compareable接口。
static List<People> list = new ArrayList<>();
public static void main(String[] args) {
list.add(new People("liu", 23));
list.add(new People("liu2", 24));
list.add(new People("liu3e", 33));
list.add(new People("liu4", 13));
list.add(new People("liu5", 22));
Collections.sort(list,new Comparator<People>() {//构造匿名内部类对象
@Override
public int compare(People o1, People o2) {
// TODO Auto-generated method stub
return o1.getAge()-o2.getAge();
}
});
for(int i =0;i<list.size();i++) {
System.out.println(list.get(i).getAge());
}
}
如何给Map进行排序
我们要知道Map内部的数据是通过什么去组织,这里以hashmap为例子。
transient Node<K,V>[] table;//定义了一个Node结点数组
static class Node<K,V> implements Map.Entry<K,V> {
查看Entry,是一个接口,里面提供了相应key-value的set、get方法。
到这里我们其实就可以看出Entry很像javabean对象,来封装key-value的。
我们常称Entry为条目。
有了上述的前提知识,下面对于map的排序就会很好理解。
我们知道Map中装的是Entry对象,我们让Entry可以排序就好了。
- 一种你写一个Entry类实现Entry,并且实现Compareable,就可以比较。
- 看例子
Set s = map.entrySet();//获取map的条目集合
List<Map.Entry<String,Integer>> l = new ArrayList<>(s);//这里需要注意将set构造成List,才可以调用 Collections.sort方法排序
Collections.sort(l,new Comparator<Map.Entry<String,Integer>>() {
@Override
//这里比较是List中的条目Entry两个对象的值来排序
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
// TODO Auto-generated method stub
return o2.getValue()-o1.getValue();
}
});