JavaSE学习笔记(21.List集合排序)

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 + " "));
    }
}

字母序排序的输出结果:

忽略大小写的字母序排序的输出结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值