盘点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()));