List集合排序主要涉及到两个接口Comparable接口和Comparator接口以及一个方法Collections.sort()的使用
首先是Comparable接口的自然排序
先来看一个例子:
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Integer> list=new ArrayList<>();
list.add(123);
list.add(155);
list.add(35);
list.add(90);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
输出结果:
这个自然排序就是从小到大顺序排列,包括数字顺序,字母顺序等;
再看list集合加入相对复杂的对象排序
public class Employee implements Comparable<Employee>{
private String name;
private int age;
private double salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Employee(String name, int age, double salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
}
@Override
public String toString() {
return "Employee [name=" + name + ", age=" + age + ", salary=" + salary + "]\n";
}
@Override
public int compareTo(Employee o) {
if (salary==o.getSalary()) { //当salary相等时,比较age
if (age==o.getAge()) { //age相等时,比较姓名
//String类中自己重写了compareTo()方法,调用即可
return name.compareTo(o.getName());
}else {
return o.getAge()-age;
}
}else {
//salary不相等,返回值从小到大排列
return (int) (o.getSalary()-salary);
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Employee> list =new ArrayList<Employee>();
list.add(new Employee("张三",21 , 58.0));
list.add(new Employee("张三",21 , 58.0));
list.add(new Employee("李四",31 , 88.0));
list.add(new Employee("王五",11 , 28.0));
list.add(new Employee("赵六",11 , 28.0));
list.add(new Employee("赵六",18 , 58.0));
Collections.sort(list); //调用sort方法
System.out.println(list);
}
输出结果:
在这里我们会发现必须要实现 Comparable接口并且重写compareTo()方法,在compareTo()方法中写自定义的排序规则,总结一条返回值负数都表示小于,正数都表示大于,0表示等于,同时,在遇到字符串时,String类中本身就重写了compareTo()方法,调用即可,同时这个排序因为是运用list集合不会去除重复项用Collections.sort(list);调用比较方法;
Comparator配合set集合使用
set集合使用相对于list,最大的不同就是可以去重,接下来看一个案例
// Employee对象中写法不变
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Employee> list =new ArrayList<Employee>();
list.add(new Employee("张三",21 , 58.0));
list.add(new Employee("张三",21 , 58.0));
list.add(new Employee("李四",31 , 88.0));
list.add(new Employee("王五",11 , 28.0));
list.add(new Employee("赵六",11 , 28.0));
list.add(new Employee("赵六",18 , 58.0));
System.out.println("=======================================");
TreeSet<Employee> treeSet=new TreeSet<>();
treeSet.addAll(list);
for(Employee e:treeSet) {
System.out.println(e);
}
}
输出结果为:
set集合使用Comparable接口规则和list没有什么不同,注意两点即可,1,set会自己调用compareTo()方法,而list需要Collections.sort(list);调用比较方法。2,set会去除重复项。
Comparator的临时排序
来看一个例子。
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Employee> list =new ArrayList<Employee>();
list.add(new Employee("张三",21 , 58.0));
list.add(new Employee("张三",21 , 58.0));
list.add(new Employee("李四",31 , 88.0));
list.add(new Employee("王五",11 , 28.0));
list.add(new Employee("赵六",11 , 28.0));
list.add(new Employee("赵六",18 , 58.0));
Collections.sort(list,new Comparator<Employee>() {
@Override
public int compare(Employee o1, Employee o2) {
if (o1.getSalary()==o1.getSalary()) {
if (o1.getAge()==o2.getAge()) {
return o2.getName().compareTo(o1.getName());
}else {
return o2.getAge()-o1.getAge();
}
}else {
return (int) (o2.getSalary()-o1.getSalary());
}
}
});
System.out.println(list);
输出结果:
这个在调用Collections.sort()方法时实现Comparator接口,并且重写compare()方法,compare方法中的比较排序规则与前面相同。
笔者作为一个新人,翻看和欣赏了大神的笔记后,自己总结加工,发表一下自己浅薄的见解,如果哪里说得不对,希望读者能提出批评和指正,本人表示诚心的感谢。