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]