一、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);