Comparable接口
1:所有可以 “排序” 的类都实现了java.lang.Comparable接口,Comparable接口中只有一个方法。
2:public int compareTo(Object obj) ;
该方法:
返回 0 表示 this == obj
返回整数表示 this > obj
返回负数表示 this < obj
3:实现了 Comparable 接口的类通过实现 comparaTo 方法从而确定该类对象的排序方式。
// TreeSet 比较要实现Comparable
@Data
public class Person implements Serializable ,Comparable{
private String family;
private String data;
private String label;
public Person(String family, String data, String label) {
this.family = family;
this.data = data;
this.label = label;
}
@Override
public int compareTo(Object o) {
int flag = 1;
if(o instanceof Person){
if(Objects.equals(this.getData(), ((Person) o).getData()))
flag = 0;
}
return flag;
}
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("张三", "13129524650", ""));
list.add(new Person("李四", "13129524651", ""));
list.add(new Person("王五", "13129524652", ""));
list.add(new Person("李四", "13129524651", ""));
list.add(new Person("王五", "13129524652", ""));
Set<Person> dup = new TreeSet<>(list);
System.out.println("测试数据条数:" + dup.size());
List<Person> list1 = new ArrayList<>();
dup.forEach((key) -> {
int data = Collections.frequency(list, key); // list中比较是否有相同的数据,相同则返回1
Person test1 = new Person(key.getFamily(),key.getData(),String.valueOf(data));
System.out.println(test1);
list1.add(test1);
});
System.out.println(list1);
}
}
一般需要做比较的逻辑都可以使用的上Comparator,最常用的场景就是排序和分组,排序常使用Arrays和Collections的sort
方法,而分组则可以使用上面提供的divider方法。
排序和分组的区别在于:
排序时,两个对象比较的结果有三种:大于,等于,小于。
分组时,两个对象比较的结果只有两种:等于(两个对象属于同一组),不等于(两个对象属于不同组)