虽然目前处理排序问题大都在数据库层面通过Order By的方式处理掉了,但是难免会有一些数据需要在JAVA缓存里去做,比如一些统计的排序,影响数据库查询速度的且不涉及到分页有限的数据排序。下面介绍两种依靠JAVA比较器实现的集合排序的方法。
一、实现Comparable接口
importjava.util.Collections; importjava.util.LinkedList; importjava.util.List; publicclassPersonimplementsComparable<Person> { privateStringname; privateintage; publicPerson(Stringname, intage) { this.name=name; this.age=age; } publicStringgetName() { returnname; } publicintgetAge() { returnage; } publicintcompareTo(Personother) { // 根据年龄进行比较returnInteger.compare(this.age, other.age); } publicStringtoString() { return"Person{name='"+name+"', age="+age+"}"; } publicstaticvoidmain(String[] args) { List<Person>peoples=newLinkedList<>() {{ add(newPerson("Alice", 25)); add(newPerson("Bob", 30)); add(newPerson("Charlie", 20)); }}; // 对Person对象列表进行排序Collections.sort(peoples); // 打印排序结果for (Personperson : peoples) { System.out.println(person); } } }
二、自定义Comparator类,将其传入Collections排序方法中
importjava.util.Collections; importjava.util.LinkedList; importjava.util.List; importjava.util.Comparator; publicclassPerson2{ privateStringname; privateintage; publicPerson2(Stringname, intage) { this.name=name; this.age=age; } publicStringgetName() { returnname; } publicintgetAge() { returnage; } publicStringtoString() { return"Person{name='"+name+"', age="+age+"}"; } publicstaticvoidmain(String[] args) { List<Person2>peoples=newLinkedList<>() {{ add(newPerson2("Alice", 25)); add(newPerson2("Bob", 30)); add(newPerson2("Charlie", 20)); }}; // 使用自定义比较器按照年龄进行排序Comparator<Person2>ageComparator=Comparator.comparingInt(Person2::getAge); // 对Person对象列表进行排序Collections.sort(peoples,ageComparator); // 打印排序结果for (Person2person : peoples) { System.out.println(person); } } }
三、Map集合的排序
Map的比较排序有两种方式,一种是通过TreeMap的自定义比较器实现,一种是通过将Map转为ArrayList的方式去实现。思路跟上述List的排序类似,可以自行实现
四、排序算法
最终会转化数组,通过Arrays.sort去实现排序,该方法使用了一种基于快速排序(基础类型)和归并排序(归并排序中使用到了二分排序法)的算法(TimSort),JDK17以后使用到的快速排序是Dual Pivot Quicksort,效率更高。