Java中要对列表或者数组自定义排序,有两种方法,一种是实现Comparator的方法,另一种是实现Comparable接口,然后重写compareTo方法
Comparator
假如现在有一个装了Cat的list,Cat有name和age的属性,现在要把Cat按name的长度倒序:
public static void main(String[] args) {
List<Cat> list = new ArrayList<>(Arrays.asList( new Cat("two", 17), new Cat("three", 15), new Cat("four", 16)));
Collections.sort(list, new Comparator<Cat>() {
@Override
public int compare(Cat cat1, Cat cat2) {
return cat2.getName().length() - cat1.getName().length();
}
});
list.forEach((Cat c) -> System.out.println(c.getName()+ ":" + c.getAge()));
}
在compare的方法中,有时候会不明白到底什么时候是正序,什么时候是倒序,有个小小的规律可以参考一下:
- 当 compare方法 返回 > 0的时候, 表示cat1 排在 cat2 后面 ;
- 当 compare方法 返回 < 0 的时候, 表示cat1 排在 cat2 前面;
- 当 compare 方法 返回 0 的时候, 表示cat1 和 cat2 位置不变;
或者你可以直接理解为当 cat1 -cat2 的时候是正序,cat2 - cat1为倒序
在上面的代码中, 假如cat1.name = "two",长度为3, cat2.name = "three", 长度为5, 因为 cat2.getName().length() - cat1.getName().length() > 0, 所以 cat1 排在 cat2的后面,也就是说name的长度越短的排在后面,所以这是按name长度倒序
Comparable
假如用实现Comparable接口的方法
public class Cat implements Comparable<Cat>{
private String name;
private Integer age;
...
@Override
public int compareTo(Cat o) {
return o.getName().length() - this.getName().length();
}
}
public static void main(String[] args) {
List<Cat> list = new ArrayList<>(Arrays.asList(new Cat("two", 17), new Cat("three", 15), new Cat("four", 16)));
Collections.sort(list);
list.forEach((Cat c) -> System.out.println(c.getName() + ":" + c.getAge()));
}
我们可以把compareTo中的this对象对应Comparator的cat1对象,o对应Comparator的cat2.其他规律如Comparator.
网友评论