构建对象
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
class Compar implements Comparable{
private String name;
private Integer age;
/**
* 先按年龄排序,如果年龄一样则按名字排序
*/
@Override
public int compareTo(Object o) {
Compar compar = (Compar) o;
int i = this.age - compar.age;
if (i==0){
i = this.name.compareTo(compar.name);
}
return i;
}
}
第一种方式 类实现了Comparable接口
测试 1
//构建一个集合
Compar compar1 = new Compar("a", 10);
Compar compar2 = new Compar("b", 10);
Compar compar3 = new Compar("x", 10);
Compar compar4 = new Compar("e", 1);
List<Compar> comparList = new ArrayList<>(Arrays.asList(compar2, compar1, compar3, compar4));
//使用比较
Collections.sort(comparList);
//输出
for (Compar compar : comparList) {
System.out.println("compar = " + compar);
}
/**
* compar = Compar(name=e, age=1)
* compar = Compar(name=a, age=10)
* compar = Compar(name=b, age=10)
* compar = Compar(name=x, age=10)
*/
第二种方式 使用TreeSet (不管类实现的Comparable接口)
测试 2
Compar compar1 = new Compar("a", 10);
Compar compar2 = new Compar("b", 10);
Compar compar3 = new Compar("x", 10);
Compar compar4 = new Compar("e", 1);
//按名字排序
TreeSet<Compar> treeSet = new TreeSet<>(new Comparator<Compar>() {
@Override
public int compare(Compar o1, Compar o2) {
return o1.getName().compareTo(o2.getName());
}
});
//如你所见 上边使用了 匿名内部类 所以可以用lambda简化 如下:
//TreeSet<Compar> treeSet = new TreeSet<>((o1, o2) -> o1.getName().compareTo(o2.getName()));
//还可以再简化 (o1, o2) -> o1.getName().compareTo(o2.getName()) 可被替换为 'Comparator.comparing'
//TreeSet<Compar> treeSet = new TreeSet<>(Comparator.comparing(Compar::getName));
//收集元素
treeSet.add(compar1);
treeSet.add(compar2);
treeSet.add(compar3);
treeSet.add(compar4);
//输出
for (Compar compar : treeSet) {
System.out.println("compar = " + compar);
}
/**
* compar = Compar(name=a, age=10)
* compar = Compar(name=b, age=10)
* compar = Compar(name=e, age=1)
* compar = Compar(name=x, age=10)
*/
第三种方式 使用流 (不管类实现的Comparable接口)
测试 3
Compar compar1 = new Compar("a", 10);
Compar compar2 = new Compar("b", 10);
Compar compar3 = new Compar("x", 10);
Compar compar4 = new Compar("e", 1);
List<Compar> comparList = new ArrayList<>(Arrays.asList(compar2, compar1, compar3, compar4));
//先按年龄排序,如果年龄一样则按名字排序
List<Compar> collect = comparList.stream().sorted(Comparator.comparingInt(Compar::getAge).thenComparing(Compar::getName).collect(Collectors.toList());
//输出
for (Compar compar11 : collect) {
System.out.println("compar11 = " + compar11);
}
/**
* compar = Compar(name=e, age=1)
* compar = Compar(name=a, age=10)
* compar = Compar(name=b, age=10)
* compar = Compar(name=x, age=10)
*/