Collections工具类
- java.util.Collections(工具类):它里面包含了一些对Collection集合操作的一些实用方法。
常用方法:
- public static void shuffle(List<?> list) :打乱集合顺序。
- public static < T extends Comparable> void sort(List list) :将集合中元素按照默认规则排序。
- public static void sort(List list,Comparator<? super T> ) :将集合中元素按照指定规则排序。
代码演示(shuffle) :
public class Demo03 {
public static void main(String[] args) {
//1.定义一个集合
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(50);
list.add(15);
list.add(25);
list.add(77);
list.add(63);
list.add(48);
list.add(32);
System.out.println(list);//[10, 50, 15, 25, 77, 63, 48, 32]
//打乱集合顺序
Collections.shuffle(list);
System.out.println(list);//[15, 25, 48, 63, 50, 32, 77, 10]
}
}
代码演示(sort方法自排序):
-
调用的是:public static void sort(List<? extends Comparable> list):
-
自排序指:集合中的元素必须实现Comparable接口,并重写compareTo()方法。sort()方法会利用这个方法对元素进行比较,进而进行排序。
compareTo()方法返回: 负数:当前对象 < 参数对象,【会将当前对象排在参数对象前面】 0: 当前对象 = 参数对象,【不排序】 正数:当前对象 > 参数对象,【会将当前对象排在参数对象后面】
自定义Student类(如果要对Student对象进行排序,需要Student实现Comparable接口,并重写compareTo()方法)
public class Student implements Comparable<Student>{
private String name;
private int age;
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;
}
/*
此类需要实现Comparable接口,并重写compareTo()方法
此方法被Collections的sort()方法调用,
用于:对象的比较,并利用比较的结果进行排序。
比较的结果:是一个int值
compareTo()方法返回:
负数:当前对象 < 参数对象,【会将当前对象排在参数对象前面】
0: 当前对象 = 参数对象,【不排序】
正数:当前对象 > 参数对象,【会将当前对象排在参数对象后面】
*/
@Override
public int compareTo(Student o) {
System.out.println("compareTo()....");
System.out.println("当前对象:" + this.name + "," + this.age +
" 参数对象:" + o.name + "," + o.age);
//第一种写法:
//1.如果我们想按:年龄升序排序(this – 参数)
// return this.age - o.age;//25 18
//2.如果我们想按:年龄降序排序(参数 – this)
// return o.age - this.age;//18 25,会让本方法返回负数
//第二种写法
//1.如果我们想按:年龄升序排序
/*if (this.age < o.age) {
//返回负数
return -1;
} else if (this.age == o.age) {
//返回0
return 0;
} else{
//返回1
return 1;
}*/
//2.如果我们想按:年龄降序排序
if (this.age < o.age) {
//返回正数
return 1;
} else if (this.age == o.age) {
//返回0
return 0;
} else{
//返回-1
return -1;
}
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试类:
public class Demo04 {
public static void main(String[] args) {
//1.定义一个集合
ArrayList<Integer> list1 = new ArrayList<>();//Integer实现了Comparable接口
list1.add(10);
list1.add(50);
list1.add(15);
list1.add(25);
list1.add(77);
list1.add(63);
list1.add(48);
list1.add(32);
System.out.println("原数据" + list1);//[10, 50, 15, 25, 77, 63, 48, 32]
//排序
Collections.sort(list1);
System.out.println("排序后:" + list1);//[10, 15, 25, 32, 48, 50, 63, 77]
//2.定义一个字符串集合
ArrayList<String> list2 = new ArrayList<>();//String类也实现了Comparable接口
list2.add("cba");
list2.add("acb");
list2.add("bac");
list2.add("cab");
list2.add("abc");
list2.add("bca");
System.out.println("原数据:" + list2);//原数据:[cba, acb, bac, cab, abc, bca]
//排序
Collections.sort(list2);
System.out.println("排序后:" + list2);//排序后:[abc, acb, bac, bca, cab, cba]
//3.定义一个存储Student的集合
ArrayList<Student> stuList = new ArrayList<>();//要求Student类也要实现Comparable接口
stuList.add(new Student("张三", 18));
stuList.add(new Student("李四", 25));
stuList.add(new Student("王五", 17));
System.out.println("-------------------------------");
System.out.println(stuList);
//排序
Collections.sort(stuList);
System.out.println(stuList);
}
}
代码演示(sort方法比较器排序):
- 调用:public static void sort(List list,Comparator<? super T> com ):此方法也可以对参数list中的元素进行排序。
- list中的元素可以不实现Comparable接口,可以使用第二个参数Comparator比较器进行排序。
- 另外还有一个作用,如果list中元素实现的Comparable接口,也重写了compareTo()方法,但此时不想按原来的规则排序,此时也可使用这个方法,传入一个比较器,就会使用比较器进行排序。
定义Student类(不需要实现Comparable接口)
public class Student {
private String name;
private int age;
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 Demo05 {
public static void main(String[] args) {
ArrayList<Integer> intList = new ArrayList<>();
intList.add(10);
intList.add(16);
intList.add(7);
intList.add(22);
intList.add(66);
intList.add(33);
intList.add(88);
System.out.println("原集合:" + intList);//原集合:[10, 16, 7, 22, 66, 33, 88]
/*Collections.sort(intList);//结果是:升序
System.out.println("升序:" + intList);//升序:[7, 10, 16, 22, 33, 66, 88]
*/
//我想降序排序
Collections.sort(intList, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;//降序
}
});
System.out.println("比较器降序:" + intList);//比较器升序:[88, 66, 33, 22, 16, 10, 7]
//Student类(它没有实现Comparable接口)
ArrayList<Student> stuList = new ArrayList<>();
stuList.add(new Student("张三", 18));
stuList.add(new Student("李四", 25));
stuList.add(new Student("王五", 17));
Collections.sort(stuList, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getAge() - o1.getAge();
}
});
System.out.println(stuList);
}
}