Collections集合工具类、Comparable接口(比较接口)、Comparator接口(比较接口)
Collections集合工具类
常用的静态方法:
public static <T> boolean addAll(Collection<? super T> c, T... elements)//将所有指定元素添加到指定的集合
public static void shuffle(List<?> list) //将List集合中的元素顺序打乱
public static <T extends Comparable<? super T>> void sort(List<T> list)//对 自然排序的元素进行升序排列
package mycollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Random;
public class TestCollections01 {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
Collections.addAll(arrayList,"a","b","c","d","e");
System.out.println(arrayList);//[a, b, c, d, e]
Collections.shuffle(arrayList,new Random(1));
System.out.println(arrayList);//[c, d, b, e, a]
Collections.sort(arrayList);
System.out.println(arrayList);//[a, b, c, d, e]
ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,1,3,2,6,4);
System.out.println(list);//[1, 3, 2, 6, 4]
Collections.sort(list);
System.out.println(list);//[1, 2, 3, 4, 6]
}
}
注意:
sort(List
被排序的集合里面存储的元素,必须实现Comparable,重写接口中的CompareTo定义排序的规则
comparable接口的排序规则:(java.lang public interface Comparable
自己(this)-参数:升序
参数-自己(this):倒序
自定义数据类型存储在集合中,进行sort,该自定义类型必须实现Comparable接口,实现的了compareTo方法
package mycollection;
import java.util.ArrayList;
import java.util.Collections;
//对集合中的自定义数据类型的排序
public class TestCollectionsSort01 {
public static void main(String[] args) {
ArrayList<Man> arrayList = new ArrayList<>();
Collections.addAll(arrayList,new Man("小明",12),new Man("小华",2),new Man("小张",8));
System.out.println(arrayList);//[Man{name='小明', age=12}, Man{name='小华', age=2}, Man{name='小张', age=8}]
// Collections.sort(arrayList);在自定义类Man没有实现Comparable接口时,编译时,会自动报错
Collections.sort(arrayList);
System.out.println(arrayList);//[Man{name='小华', age=2}, Man{name='小张', age=8}, Man{name='小明', age=12}]
}
}
class Man implements Comparable<Man>{
private String name;
private int age;
public Man() {
}
public Man(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 "Man{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//实现了Comparable接口,重写了compareTo方法
@Override
public int compareTo(Man o) {
return this.age - o.age;//按年龄升序排列
}
}
public static <T> void sort(List<T> list, Comparator<? super T> c)//排序
Comparator和Comparable的 区别
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写compareTo方法
Comparator:相当于找一个第三方菜品,比较两个
Comparator的排序规则:
o1-o2:升序
o2-o1:降序
package mycollection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class TestCollectionsSort02 {
public static void main(String[] args) {
ArrayList<Woman> arrayList = new ArrayList<>();
Collections.addAll(arrayList,new Woman("小红",12),new Woman("b小绿",5),new Woman("小黄",6),new Woman("a小蓝",5));
System.out.println(arrayList);//[Woman{name='小红', age=12}, Woman{name='b小绿', age=5}, Woman{name='小黄', age=6}, Woman{name='a小蓝', age=5}]
Collections.sort(arrayList,new Comparator<Woman>() {
@Override
public int compare(Woman o1, Woman o2) {
int result = o1.getAge() - o2.getAge();//按年龄升序
if (result == 0){//如果年龄相同,按名字首字母排序
result = o1.getName().charAt(0) - o2.getName().charAt(0);
}
return result;
}
});
System.out.println(arrayList);//[Woman{name='a小蓝', age=5}, Woman{name='b小绿', age=5}, Woman{name='小黄', age=6}, Woman{name='小红', age=12}]
}
}
class Woman{//注意,这儿没有实现Comparable接口,重写compareTo方法
private String name;
private int age;
public Woman() {
}
public Woman(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 "Woman{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}