一.Collections工具类
1.常用功能
java.util.Collections 是集合工具类,用来对集合进行操作.
-
public static boolean addAll(Collection c, T… elements) :往集合中添加一些元素。
-
public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。
-
public static void sort(List list) :将集合中元素按照默认规则排序。
-
public static void sort(List list,Comparator<? super T> ) :将集合中元素按照指定规则排序
public class CollectionsDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
//原来写法
//list.add(12);
//list.add(14);
//list.add(15);
//list.add(1000);
//采用工具类 完成 往集合中添加元素
Collections.addAll(list, 5, 222, 1,2);
System.out.println(list);//[5, 222, 1, 2]
//打乱集合顺序
Collections.shuffle(list);
System.out.println("打乱顺序之后的集合:"+list);//[1, 222, 2, 5](随机)
}
}
结果:
[5, 222, 1, 2]
[1, 222, 2, 5]
2.Collections排序的方法
按照默认规则进行排序:
- public static void sort(List list):将集合中元素按照默认规则排序。
我们使用的是默认的规则对集合中的元素进行排序,那么默认规则是怎么定义出来的呢?
通过要求集合中元素所属的类实现Comparable接口,然后在实现Comparable接口的时候会重写compareTo()方法,在CompareTo()方法中指定默认规则,由于只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序,所以称为默认规则
按照指定规则进行排序:
- public static void sort(List list,Comparator<? super T> ):将集合中元素按照指定规则排序。
我们使用指定规则对集合中元素进行排序,那么如何指定规则呢?
通过将Comparator 比较器对象传递给sort方法,在Comparator比较器中有一个int compare(T o1, T o2)方法,在compare方法中指定比较规则,从而允许在排序顺序上实现精确控制
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("cba");
list.add("aba");
list.add("sba");
list.add("nba");
//排序方法
// 按照String类中指定的默认排序规则进行排序
Collections.sort(list);
System.out.println(list);//[aba, cba, nba, sba]
// 指定规则进行排序
// 按照首字母降序排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// 前减后:升序
// 后减前: 降序
return o2.charAt(0) - o1.charAt(0);
}
});
System.out.println(list);//[sba, nba, cba, aba]
}
二.Comparable和Comparator两个接口的区别
-
Comparable:
强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法 被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现 此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中 的键或有序集合中的元素,无需指定比较器。 -
Comparator
强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或 有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。
Student 初始类
public class Student{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试类:
public class Demo {
public static void main(String[] args) {
// 创建四个学生对象 存储到集合中
ArrayList<Student> list = new ArrayList<Student>();
list.add(new Student("rose",18));
list.add(new Student("jack",16));
list.add(new Student("abc",16));
list.add(new Student("ace",17));
list.add(new Student("mark",16));
/*
让学生 按照年龄排序 升序
*/
// Collections.sort(list);//要求 该list中元素类型 必须实现比较器Comparable接口
for (Student student : list) {
System.out.println(student);
}
}
}
发现,当我们调用Collections.sort()方法的时候 程序报错了。
原因:如果想要集合中的元素完成排序,那么必须要实现比较器Comparable接口。
于是我们就完成了Student类的一个实现,如下:
public class Student implements Comparable<Student>{
....
@Override
public int compareTo(Student o) {
return this.age-o.age;//升序
}
}
结果:
Student{name='jack', age=16}
Student{name='abc', age=16}
Student{name='mark', age=16}
Student{name='ace', age=17}
Student{name='rose', age=18}
扩展
对ArrayList集合中的Student对象按照指定规则进行排序
指定规则:
- 以学生年龄降序
- 以学生年龄降序,如果年龄相同,就以姓名的首字母 升序排序
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 年龄降序
int result = o2.getAge()-o1.getAge();//年龄降序
if(result==0){//姓名的首字母 升序
result = o1.getName().charAt(0)-o2.getName().charAt(0);
}
return result;
}
});
结果:
Student{name='rose', age=18}
Student{name='ace', age=17}
Student{name='abc', age=16}
Student{name='jack', age=16}
Student{name='mark', age=16}