1. Comparator类和Comparable类说明:
List集合的排序主要是依赖于Comparator类或Comparable类实现的:
- 第一种,List集合元素是Comparable类的实现类,在元素类中明确排序的比较规则!
- 第二种,针对于List集合元素不是Comparable类的实现类的场景,在调用List类的sort方法时,需要传入Comparator函数接口类的实现类,用来明确排序的比较规则!
代码示例:
/*通过Comparator类,实现List的排序*/
class T1 {
public int a;
public int b;
public T1(int a, int b) {
this.a = a;
this.b = b;
}
}
/*通过Comparable类,实现list的排序*/
class T2 implements Comparable<T2> {
public int a;
public int b;
public T2(int a, int b) {
this.a = a;
this.b = b;
}
/* 返回0表示,当前对象和比较对象相等
* 返回正整数表示,当前对象大于比较对象元素
* 返回负整数表示,当前对象小于比较对象元素*/
@Override
public int compareTo(T2 o) {
if (this.a == o.a) {
return 0;
} else if (this.a > o.a) {
return 1;
} else {
return -1;
}
}
}
public class ListTest {
public static void main(String[] args) {
/*通过Comparator类实现List的排序*/
List<T1> l1 = new ArrayList<>();
l1.add(new T1(100,10));
l1.add(new T1(10,10));
l1.add(new T1(300,10));
l1.add(new T1(50,10));
l1.stream().forEach(e -> System.out.print(e.a + " "));
/*返回0表示,两个元素相等
* 返回正整数表示,o1元素大于o2元素
* 返回负整数表示,o1元素小于o2元素*/
l1.sort((o1, o2) -> {
if (o1.a == o2.a) {
return 0;
}else if (o1.a > o2.a) {
return 1;
}else {
return -1;
}
});
System.out.println();
l1.stream().forEach(e -> System.out.print(e.a + " "));
/*通过Comparable类,实现list的排序*/
List<T2> l2 = new ArrayList<>();
l2.add(new T2(100,10));
l2.add(new T2(10,10));
l2.add(new T2(300,10));
l2.add(new T2(50,10));
System.out.println();
l2.stream().forEach(e -> System.out.print(e.a + " "));
l2.sort(null);
System.out.println();
l2.stream().forEach(e -> System.out.print(e.a + " "));
}
}
输出:
Ps:Comparator类和Comparable类使用的时候,注意比较方法返回0、正整数、负整数的含义;切记sort方法默认都是按照升序排序,但可以通过修改比较方法的返回值来调整为降序排序!
2. 关于List集合sort方法的调用:
- 直接调用List接口的default void sort(Comparator<? super E> c)方法;如果集合元素类型为Comparable类的实现类,入参可以为null
- 通过Collections工具类的public static <T extends Comparable<? super T>> void sort(List<T> list)或者public static <T> void sort(List<T> list, Comparator<? super T> c)
- 通过List类中的toArray()方法,将List类型转换为Array类型;再通过Arrays工具类中的sort系列方法进行排序,排序后再转换为List!
总结:虽然上述实现方法有三种,但是本质只有一种;Collections工具类的sort方法就是调用的List接口中的sort方法,List接口中的sort方法本质上就是通过Arrays工具类中的sort系列方法实现的;是否需要明确指定Comparator,都取决于元素类型是否为Comparable类的实现类!
3. String类作为List集合元素的排序:
String类是Comparable类的实现类,是一个可比较类型,默认支持List集合的sort排序,默认排序规则为按照字母序排序;同时String类中还提供了另一种排序规则,按照忽略字母大小写的字母序排序!
代码示例:
public class ListTest {
public static void main(String[] args) {
List<String> l1 = new ArrayList<>();
l1.add("abc");
l1.add("abd");
l1.add("bcd");
l1.add("ABC");
l1.add("BCD");
l1.add("ABD");
l1.add("*$");
l1.add("12");
l1.add("13");
l1.stream().forEach(e -> System.out.print(e + " "));
/*使用String类中默认的比较规则,按照字母序排序,即按照字符大小排序*/
l1.sort(null);
/*String类中还提供了另一种排序规则,忽略字母大小写的字母序排序*/
//l1.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println();
l1.stream().forEach(e -> System.out.print(e + " "));
}
}
字母序排序的输出结果:
忽略大小写的字母序排序的输出结果: