一奥喻、addAll&shuffle
Collections是集合工具類骄瓣,用來對集合進行操作在讶。部分方法如下:
public static <T> boolean addAll(Collection<T> c,T...elements):往集合中添加一些元素户辞。
public static void shuffle(list<?> list)打亂順序:打亂集合順序
public class demo1 {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<>();
Collections.addAll(arr,"abc","Hello","Java");//一次添加多個元素
System.out.println(arr);
Collections.shuffle(arr);//打亂順序
System.out.println(arr);
}
}
- addAll無法同時添加多個對象
二蚀同、sort
public static <T> void sort(list<T> list):將集合中元素按照默認規(guī)則排序
注意:
sort(list<T> list)使用前提
被排序的集合里邊存儲的元素翔横,必須實現(xiàn)Comparable读跷,重寫接口中的compareTo
Comparable接口的排序規(guī)則:
自己(this)-參數(shù):升序,反之則降序
@Override
public int compareTo(Person o) {
return 0;//認為元素都是相同的
//自定義比較的規(guī)則,比較兩人的年齡(this,參數(shù)Person)
return this.getAge() - o.getAge();//年齡升序
}
public class Person implements Comparable<Person>{
private String name;
private int age;
/*
省略部分常規(guī)代碼
*/
//重寫排序的規(guī)則
@Override
public int compareTo(Person o) {
// return 0;//認為元素都是相同的
// 自定義比較的規(guī)則,比較兩人的年齡(this,參數(shù)Person)
return this.getAge() - o.getAge();//年齡升序
}
}
public class demo2Sort {
public static void main(String[] args) {
ArrayList<Integer> 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<Person> 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的區(qū)別
相對于上面的Comparable
,Comparator
不需要在實體類中實現(xiàn)Comparable<Person>
效览,直接使用Collections.sort()
工具進行排序,根據(jù)自己的需求重寫return 后面的代碼荡短。
import java.util.*;
public class demo3Sort {
public static void main(String[] args) {
ArrayList<Integer> i = new ArrayList<>();
Collections.addAll(i,1,3,5,7,5,3,6,8,5,7);
Collections.sort(i, new Comparator<Integer>() {//重寫排序方法
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;//前-后就是升序
}
});
System.out.println(i);//對集合內的數(shù)字進行升序排序
ArrayList<Student> 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<Student>() {
@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丐枉,后者相比前者有如下優(yōu)點:
1、如果實現(xiàn)類沒有實現(xiàn)Comparable接口掘托,又想對兩個類進行比較(或者實現(xiàn)類實現(xiàn)了Comparable接口瘦锹,但是對compareTo方法內的比較算法不滿意),那么可以實現(xiàn)Comparator接口,自定義一個比較器弯院,寫比較算法
2噩峦、實現(xiàn)Comparable接口的方式比實現(xiàn)Comparator接口的耦合性要強一些,如果要修改比較算法抽兆,則需要修改Comparable接口的實現(xiàn)類识补,而實現(xiàn)Comparator的類是在外部進行比較的,不需要對實現(xiàn)類有任何修改辫红。從這個角度說凭涂,實現(xiàn)Comparable接口的方式其實有些不太好,尤其在我們將實現(xiàn)類的.class文件打成一個.jar文件提供給開發(fā)者使用的時候贴妻。實際上實現(xiàn)Comparator 接口的方式后面會寫到就是一種典型的策略模式切油。