盘点Java中的排序操作方案
Comparable 接口-自然排序
-  类implements Comparable接口 
-  类重写 public int compareTo(Object obj)方法 
- 如果返回值为正数,则表示当前对象(调用该方法的对象)比 obj 对象“大”;反之“小”;如果为零的话,则表示两对象相等
 public class Student implements Comparable {  private int id;  private String name;  public Student() {  super();  }  @Override  public int compareTo(Object obj) {  if (obj instanceof Student) {  Student stu = (Student) obj;  return id - stu.id;  }  return 0;  }  @Override  public String toString() {  return "<" + id + ", " + name + ">";  }  } 
- 使用 Arrays 的 sort 方法 对类的对象实例数组 进行排序
Comparator 比较器排序
法1
Arrays.sort方法的参数中增加一个匿名内部类new Comparator(){},在该Comparator中重写public int compare(Object o1, Object o2)方法,指定按xxx排序
	Arrays.sort(stus, new Comparator() {  @Override  public int compare(Object o1, Object o2) {  if (o1 instanceof Student && o2 instanceof Student) {  Student s1 = (Student) o1;  Student s2 = (Student) o2;  //return s1.getId() - s2.getId(); // 按Id排  return s1.getName().compareTo(s2.getName()); // 按姓名排  }  return 0;  }  });  
法2
使用TreeSet并指定匿名内部类new Comparator(){},最后把 多个要排序的对象item 添加到 TreeSet中,再打印TreeSet,即得到排序后的数据
	 Student stu1 = new Student(1, "Little");  Student stu2 = new Student(2, "Cyntin");  Student stu3 = new Student(3, "Tony");  Student stu4 = new Student(4, "Gemini");  SortedSet set = new TreeSet(new Comparator() {  @Override  public int compare(Object o1, Object o2) {  if (o1 instanceof Student  && o2 instanceof Student) {  Student s1 = (Student) o1;  Student s2 = (Student) o2;  return s1.getName().compareTo(s2.getName());  }  return 0;  }     });  set.add(stu1);  set.add(stu3);   set.add(stu2);  set.add(stu4);  System.out.println(set);
java.util.Collections 工具类
Collections.sort(集合,匿名内部类)方式
 public class Main {  public static void main(String[] args) {  List<Person> people = new ArrayList<>();  // 添加一些 Person 对象到 people List ...  // 使用自定义的 Comparator 对 people List 进行排序  Collections.sort(people, new Comparator<Person>() {  @Override  public int compare(Person p1, Person p2) {  return p1.getAge() - p2.getAge(); // 按年龄升序排序  }  });  // 打印排序后的 List ...  }  }
lambda 表达式方式
Collections.sort(people, (p1, p2) -> p1.getAge() - p2.getAge());
Collections.reverse 反转排序(把一个排好顺序的集合进行反转)
int[] array = {1, 2, 3, 4, 5};  
List<Integer> list = Arrays.asList(array); // 注意:这里会返回一个固定大小的List,不支持add/remove操作  
// 由于Arrays.asList返回的List是固定大小的,所以我们不能直接反转它  
// 但可以创建一个新的ArrayList并反转它  
List<Integer> arrayList = new ArrayList<>(Arrays.asList(array));  
Collections.reverse(arrayList);  
// 如果你需要将ArrayList转回数组  
int[] reversedArray = arrayList.stream().mapToInt(Integer::intValue).toArray();
调用Comparator.reverseOrder()反转排序
 import java.util.ArrayList;  import java.util.Collections;  import java.util.Comparator;  import java.util.List;  import java.util.Random;  public class SortIntegers {  public static void main(String[] args) {  List<Integer> numbers = new ArrayList<>();  // 生成10个随机整数  Random random = new Random();  for (int i = 0; i < 10; i++) {  numbers.add(random.nextInt(100)); // 假设随机数的范围是0到99  }  // 打印原始列表  System.out.println("原始列表:");  for (Integer number : numbers) {  System.out.print(number + " ");  }  System.out.println();  // 升序排序并打印  Collections.sort(numbers);  System.out.println("升序排序后的列表:");  for (Integer number : numbers) {  System.out.print(number + " ");  }  System.out.println();  // 降序排序并打印  Collections.sort(numbers, Comparator.reverseOrder());  System.out.println("降序排序后的列表:");  for (Integer number : numbers) {  System.out.print(number + " ");  }  System.out.println();  }  
}
java8stream写法
集合.sort()方法
List<Person> people = Arrays.asList(new Person("Alice", 25), new Person("Bob", 20), new Person("Charlie", 30));  
people.sort((p1, p2) -> p1.getAge() - p2.getAge()); // 按年龄升序排序  
System.out.println(people); // 输出按年龄排序后的人员列表
自定义排序(使用方法引用)
// 假设Person类有一个静态方法用于比较年龄  public static int compareByAge(Person p1, Person p2) {  return p1.getAge() - p2.getAge();  }  List<Person> people = ...; // 初始化人员列表  
people.sort(Person::compareByAge); // 使用方法引用进行排序
排序时处理空值或特殊情况
 List<String> strings = Arrays.asList("apple", null, "banana", "", "cherry");  
strings.sort((s1, s2) -> {  if (s1 == null && s2 == null) return 0;  if (s1 == null) return 1;  if (s2 == null) return -1;  if (s1.isEmpty() && s2.isEmpty()) return 0;  if (s1.isEmpty()) return 1;  if (s2.isEmpty()) return -1;  return s1.compareTo(s2);  
});  
System.out.println(strings); // 输出排序后的字符串列表,空值和空字符串被放在后面
使用jdframe框架
引入依赖
 <dependency><groupId>io.github.burukeyou</groupId><artifactId>jdframe</artifactId><version>0.0.2</version></dependency>
使用内部的排序API
- 准备集合数据
	static List<Student> studentList = new ArrayList<>();static {studentList.add(new Student(1,"a","一中","一年级",11, new BigDecimal(1)));studentList.add(new Student(2,"a","一中","一年级",11, new BigDecimal(1)));studentList.add(new Student(3,"b","一中","三年级",12, new BigDecimal(2)));studentList.add(new Student(4,"c","二中","一年级",13, new BigDecimal(3)));studentList.add(new Student(5,"d","二中","一年级",14, new BigDecimal(4)));studentList.add(new Student(6,"e","三中","二年级",14, new BigDecimal(5)));studentList.add(new Student(7,"e","三中","二年级",15, new BigDecimal(5)));
}
- 可以多重排序
	 // 等价于 order by age desc
SDFrame.read(studentList).sortDesc(Student::getAge);
//  等价于 order by age desc, level asc
SDFrame.read(studentList).sortDesc(Student::getAge).sortAsc(Student::getLevel);
// 等价于 order by age asc
SDFrame.read(studentList).sortAsc(Student::getAge);
// 使用Comparator 排序
SDFrame.read(studentList).sortAsc(Comparator.comparing(e -> e.getLevel() + e.getId()));