一、addAll&shuffle
Collections是集合工具类,用来对集合进行操作。部分方法如下:
public static boolean addAll(Collection c,T...elements):往集合中添加一些元素。
public static void shuffle(list> list)打乱顺序:打乱集合顺序
public class demo1 {
public static void main(String[] args) {
ArrayList arr = new ArrayList<>();
Collections.addAll(arr,"abc","Hello","Java");//一次添加多个元素
System.out.println(arr);
Collections.shuffle(arr);//打乱顺序
System.out.println(arr);
}
}
- addAll无法同时添加多个对象
二、sort
public static
注意:
sort(list list)使用前提
被排序的集合里边存储的元素,必须实现Comparable,重写接口中的compareTo
Comparable接口的排序规则:
自己(this)-参数:升序,反之则降序
@Override
public int compareTo(Person o) {
return 0;//认为元素都是相同的
//自定义比较的规则,比较两人的年龄(this,参数Person)
return this.getAge() - o.getAge();//年龄升序
}
public class Person implements Comparable{
private String name;
private int age;
/*
省略部分常规代码
*/
//重写排序的规则
@Override
public int compareTo(Person o) {
// return 0;//认为元素都是相同的
// 自定义比较的规则,比较两人的年龄(this,参数Person)
return this.getAge() - o.getAge();//年龄升序
}
}
public class demo2Sort {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
Collections.addAll(list,1,2,3,5,6,4,8,7,0,9);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
ArrayList p = new ArrayList<>();
p.add(new Person("小丑",20));
p.add(new Person("小王",22));
p.add(new Person("小李",21));
System.out.println(p);
// Collections.sort(p);//无法直接对对象进行排序
Collections.sort(p);
System.out.println(p);//年龄升序进行排序
}
}
三、Comparator和Comparable的区别
相对于上面的Comparable
,Comparator
不需要在实体类中实现Comparable
,直接使用Collections.sort()
工具进行排序,根据自己的需求重写return 后面的代码。
import java.util.*;
public class demo3Sort {
public static void main(String[] args) {
ArrayList i = new ArrayList<>();
Collections.addAll(i,1,3,5,7,5,3,6,8,5,7);
Collections.sort(i, new Comparator() {//重写排序方法
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;//前-后就是升序
}
});
System.out.println(i);//对集合内的数字进行升序排序
ArrayList stu = new ArrayList<>();
stu.add(new Student("a迪丽热巴",21));
stu.add(new Student("c古力娜扎",20));
stu.add(new Student("b马尔扎哈",22));
stu.add(new Student("d迪丽热巴",22));
/*
对集合中的对象按照年龄进行升序排序
*/
Collections.sort(stu, new Comparator() {
@Override
public int compare(Student o1,Student o2) {
int result1 = o1.getAge() - o2.getAge();//按照年龄
int result2 = o1.getName().charAt(0) - o2.getName().charAt(0);//按照名字首字母
return result2;
}
});
System.out.println(stu);//对集合中的对象按照年龄进行升序排序
}
}
总结:
两种比较器Comparable和Comparator,后者相比前者有如下优点:
1、如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法
2、实现Comparable接口的方式比实现Comparator接口的耦合性要强一些,如果要修改比较算法,则需要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改。从这个角度说,实现Comparable接口的方式其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。实际上实现Comparator 接口的方式后面会写到就是一种典型的策略模式。