学习备忘,自己写一遍,方便以后查找。
一、基础说明
Java 自定义对象的排序,有两种方法可以实现;
第一种方法是类实现Comparable<T>接口,然后调用Collections.sort(List)方法进行排序;
第二种方法是类不实现Comparable<T>接口,而在排序时使用Collections.sort(List, Comparator<T>)方法,并实现其中的Comparator<T>接口。
二、第一种方式,类实现Comparable<T>接口
package com.casic.usvapi.test; import lombok.Data; /** * @author Spqin * @Date 2020/10/31 23:47 */ @Data public class Student implements Comparable<Student>{ private String name; private Integer age; public Student(String name, int age) { this.name = name; this.age = age; } /** * 排序 this在前是升序,this在后是降序 * @param o * @return */ @Override public int compareTo(Student o) { //return this.age.compareTo(o.getAge()); //升序排列 return o.getAge().compareTo(this.age); //降序排列 } @Override public String toString() { return "Student{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } }
第一种方法的问题:属性必须是封装类,不能是int,float 这种类型。
三、第种方式,类不实现Comparable<T>接口,在Collections.sort()方法中实现Comparable<T>接口
package com.casic.usvapi.test; import lombok.Data; /** * @author Spqin * @Date 2020/10/31 23:47 */ @Data public class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } }
package com.casic.usvapi.test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * @author Spqin * @Date 2020/10/31 23:49 */ public class StudentSortTest { public static void main(String[] args) { List<Student> students = new ArrayList<>(); students.add(new Student("A", 17)); students.add(new Student("C", 20)); students.add(new Student("B", 16)); students.add(new Student("D", 17)); Collections.sort(students, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { //return o1.getAge() - o2.getAge(); // o1 - o2 是升序,相等保持原来顺序 return o1.getAge() - o2.getAge(); //o2 - o1 是降序,相等保持原来顺序 } }); for(Student student:students){ System.out.println(student.toString()); } } }
第二种方法可以实现基础类型的排序。
原文:https://www.cnblogs.com/spqin/p/13908381.html