Java Collections类的shuffle和sort方法详解

一、shuffle方法:随机排列

注意:只能在有排列顺序的List接口中使用

查看源码: 

     1、若集合元素个数小于shuffle阈值或者集合支持随机访问,那么从后往前遍历集合,交换元素。

  2、 否则,先将集合转化为数组(提高访问效率),再进行遍历,交换元素(在数组中进行),最后设置集合元素。

 shuffle应用场景:如斗地主扑克牌,打麻将等等(打乱顺序)

 实例:

 public static void main(String[] args) {
        //固定大小集合
        List<String> names = Arrays.asList("peter", "boy", "collection","bamboo");
        //泛型集合
        List<String> list = new ArrayList<>(names);
        //List随机排列
        get_shuffle(list);


        //学生对象
        Student stu1 = new Student("张三", "男", 19);
        Student stu2 = new Student("翠花", "女", 18);
        Student stu3 = new Student("吉吉国王", "男", 5);
        //泛型集合
        List<Student> list2 = new ArrayList<>();
        list2.add(stu1);
        list2.add(stu2);
        list2.add(stu3);
        //List随机排列
        get_shuffle(list2);
}

  private static void get_shuffle(List list) {
        System.out.println("原来数据:"+list);
        Collections.shuffle(list);
        System.out.println("随机排列:" + list);
    }

 二、sort方法:排序排列

  Collections中sort方法专门给List排序,而Arrays中sort方法专门给数组进行排序。

 (1) 查看Collections中sort方法源码

 实例1:不同类型进行排序

    public static void main(String[] args) {
      //固定大小集合
        List names2 = Arrays.asList("peter", "boy", "collection","bamboo",222);
        //泛型集合
        List list3 = new ArrayList<>(names2);
        get_sort(list3);
     }

    private static void get_sort(List list) {
        System.out.println("原来排列:"+list);
        Collections.sort(list);
        System.out.println("升序排列:" + list);
    }

 运行时发生异常:

 原因: sort方法只能对同种类型集合进行排序,并且只能对集合进行升序排序。

 (2)查看Collections中sort方法源码

 

 实例2:使用匿名内部类进行排序

 public static void main(String[] args) {     
        Emp e1 = new Emp("刘飞", "男", 20);
        Emp e2 = new Emp("张力", "女", 22);
        Emp e3 = new Emp("李恒", "男", 18);
        //泛型集合
        List<Emp> list4 = new ArrayList<>();
        list4.add(e1);
        list4.add(e2);
        list4.add(e3);
        get_sort_object(list4);
   }


private static void get_sort_object(List<Emp> list) {
        System.out.println("原来排列:"+list);
        // 使用匿名内部类进行排序
        Collections.sort(list, new Comparator<Emp>() {
            @Override
            public int compare(Emp o1, Emp o2) {
                // 自定义排序规则
                return o1.getAge()-o2.getAge();
            }
        });
        System.out.println("升序排列:" + list);
    }

 

三、使用Lambda简化Comparator接口

(1)sort 排序

   //Collections.sort()排序
        System.out.println("未排序前:"+list4);
        Collections.sort(list4,((o1, o2) -> o2.getAge()-o1.getAge()));
        System.out.println("降序排列:"+list4);

 (2) sorted() 返回对象集合

  //sorted() 返回对象集合排序
        System.out.println("未排序前:"+list4);
        List<Emp> emps=list4.stream().sorted((ee1,ee2)->ee1.getAge()-ee2.getAge()).collect(Collectors.toList());
        System.out.println("升序排列:"+emps);

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值