工具类Collections

java.util.Collections是集合工具类,用来对集合进行操作。部分方法如下:

public static <T> boolean addAll(Collection<T> c,T... elements):往集合中添加一些元素

ArrayList<String> arr = new ArrayList<>();
// 多次添加,麻烦
arr.add("aaa");
arr.add("bbb");
arr.add("ccc");
arr.add("ddd");
arr.add("eee");
System.out.println(arr); // [aaa, bbb, ccc, ddd, eee]

// 一次添加
// 静态方法,直接类名调用
Collections.addAll(arr,"fff","ggg","hhh");
System.out.println(arr); // [aaa, bbb, ccc, ddd, eee, fff, ggg, hhh]

public static void shuffle(List<?> list):打乱集合顺序

// public static void shuffle(List<?> list):打乱集合顺序
Collections.shuffle(arr);
System.out.println(arr); // [bbb, ccc, eee, ddd, fff, ggg, hhh, aaa]

public static void sort(List<T> list):将集合中元素按照默认规则(升序)排序

注意:只能传入List集合,不能传入Set集合,并且也是静态方法。

可以看出无论是Integer还是String都实现了Comparable接口,里面有个compareTo方法,提供规则进行排序。

使用前提:被排序的集合里边存储的元素,必须实现Comparable接口,重写compareTo方法,定义排序的规则。

(注意这是Collection工具类的sort排序方法的前提,注意不要和Set不重复元素原因混淆)

// public static void sort(List<T> list):将集合中元素按照默认规则(升序)排序
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,2,3,4,5,7,55,33,2,4,677,5,32,1);
// 有序集合,存取一致
System.out.println(list); // [2, 3, 4, 5, 7, 55, 33, 2, 4, 677, 5, 32, 1]
// 升序排序
Collections.sort(list);
System.out.println(list); // [1, 2, 2, 3, 4, 4, 5, 5, 7, 32, 33, 55, 677]
// 重写排序的规则
@Override
public int compareTo(Person o) { // 比较的是对象
    // return 0; // 认为元素都是相同的
    // 自定义比较规则:比较两个人的年龄
    // return this.age - o.age; // 升序
    return o.age - this.age; // 降序
public class Person extends Object implements Comparable<Person>{

...

Person p1 = new Person("易烊千玺",18);
Person p2 = new Person("王俊凯",19);
Person p3 = new Person("王源",19);
ArrayList<Person> list2 = new ArrayList<>();
Collections.addAll(list2,p1,p2,p3);
// [Person{name='易烊千玺', age=18}, Person{name='王俊凯', age=19}, Person{name='王源', age=19}]
System.out.println(list2);
// 根据年龄排序
// [Person{name='易烊千玺', age=18}, Person{name='王俊凯', age=19}, Person{name='王源', age=19}]
Collections.sort(list2);

}

Comparable接口的排序规则:

自己(this)-参数,就是升序;

参数-自己,就是降序。

public static void sort(List<T> list , Comparator<? super T>):将集合中元素按照指定规则排序。

比较一下两个sort方法:

Comparator和Comparable的区别:

Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写comparaTo方法。

Comparator:相当于找一个第三方裁判来比较两个。

Comparator排序规则:

前面参数-后面参数:升序

后面参数-前面参数:降序

ArrayList<Integer> list = new ArrayList<>();
 Collections.addAll(list,22,33,2,11,45,6,88);
 System.out.println(list); // [22, 33, 2, 11, 45, 6, 88]
// Collections.sort(list);
// System.out.println(list); // [2, 6, 11, 22, 33, 45, 88]

 // 匿名内部类
 Collections.sort(list, new Comparator<Integer>() {
     // 重写比较规则
     @Override
     public int compare(Integer o1, Integer o2) {
        // return o1 - o2; // 前面-后面,升序
         return o2  - o1; // 后面-前面,降序
     }
 });
 // System.out.println(list); // [2, 6, 11, 22, 33, 45, 88]
 System.out.println(list); // [88, 45, 33, 22, 11, 6, 2]
 ArrayList<Student> list1 = new ArrayList<>();
 Student s1 = new Student("易烊千玺",18);
 Student s2 = new Student("王俊凯",20);
 Student s3 = new Student("王源",19);
 Student s4 = new Student("李飞",19);
 Collections.addAll(list1,s1,s2,s3,s4);
 System.out.println(list1); // [demo08.Student@1b6d3586, demo08.Student@4554617c, demo08.Student@74a14482]
 
 //public static void sort(List<T> list , Comparator<? super T>)
 // 将集合中元素按照指定规则排序。
/* Collections.sort(list1, new Comparator<Student>() {
     // 匿名内部类,重写compare方法
     // 按照年龄定排序规则
     @Override
     public int compare(Student o1, Student o2) {
         return o1.getAge() - o2.getAge(); // 升序
     }
 });*/

 Collections.sort(list1, new Comparator<Student>() {
     // 匿名内部类,重写compare方法
     // 按照年龄定排序规则
     @Override
     public int compare(Student o1, Student o2) {
         int result =  o1.getAge() - o2.getAge(); // 升序
         // 如果两个人的年龄相同,再使用姓名的首字母第一个字比较
         if(result == 0){
             char c1 = o1.getName().toCharArray()[0];
             // char c1 = o1.getName().charAt(0);
             char c2 = o2.getName().toCharArray()[0];
             return c1 - c2;
         }
         else
             return result;
     }
 });
 System.out.println(list1); // [demo08.Student@1b6d3586, demo08.Student@4554617c, demo08.Student@74a14482]

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值