同时使用Comparable接口和Comparator
同时使用Comparable接口和Comparator自定义规则排序结果会是什么样的 ?
今天在整理资料的时候偶然看见这样一个问题,想来想去,应该会和CSS一样遵循就近原则,使用Comparator的排序规则,后来实际验证了一下。话不多说,直接上代码,需要一个实体类和测试类
Student实体类
package com.xxx.action;
/**
* 该实体类实现了Comparable接口,并重写了compareTo方法,指定降序的规则
*
* @Package: com.xxx.action
* @author Peter
* @version 1.0
* @date 2018年12月12日 上午11:32:32
*
*/
public class Student implements Comparable<Student>{
private String name;
Student(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Student o) {
return o.getName().compareTo(this.getName());
}
// 为了方便看结果,重写了toString();
@Override
public String toString() {
return "Student [name=" + name + "]";
}
}
测试类
package com.xxx.action;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
/**
* 采用Junit4测试。也可以使用main方法测试。
*
* @Package: com.xxx.action
* @author Peter
* @version 1.0
* @date 2018年12月12日 上午9:08:20
*
*/
public class TestList {
@Test
public void foreachList() {
List<Student> list = new ArrayList<Student>();
// 为了方便看出顺序,就不写复杂的名字了
list.add(new Student("a"));
list.add(new Student("c"));
list.add(new Student("e"));
list.add(new Student("b"));
// 采用了1.8新特性,排序前打印一次
list.forEach(System.out::println);
// 华丽的分割线
System.out.println("---------------------");
// 通过Collections工具类中的sort方法 + Comparator自定义排序规则
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 升序
return o1.getName().compareTo(o2.getName());
}
});
// 排序后打印一次
list.forEach(System.out::println);
}
}
结果:
Student [name=a]
Student [name=c]
Student [name=e]
Student [name=b]
---------------------
Student [name=a]
Student [name=b]
Student [name=c]
Student [name=e]
结论:
同时使用同时使用Comparable接口和Comparator自定义规则排序,java会采用就近原则,使用当前测试类中的自定已排序规则。