1、Collections
java.util.Collections是一个集合的工具类
1.1、常见功能
- public static boolean addAll(Collection<? super T> c, T… elements):往集合中添加一些元素
- public static void shuffle(List<?> list):对集合中的元素进行随机排列
- public void static <T extends Comparable<? super T>> sort(List list) :升序排列
package com.bdit;
import java.util.ArrayList;
import java.util.Collections;
public class Test8 {
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<>();
// list.add(10);
// list.add(20);
// list.add(30);
// list.add(40);
//采用工具类的addAll方法
Collections.addAll(list,121,23,35,14,56,16);
//对集合中的元素进行升序排列
//Collections.sort(list);
//随机排列
Collections.shuffle(list);
for(int n:list){
System.out.println(n);
}
ArrayList<String> list2=new ArrayList<>();
list2.add("cba");
list2.add("abc");
list2.add("bca");
list2.add("123");
list2.add("true");
//升序
Collections.sort(list2);
System.out.println(list2);
}
}
2、比较器
我们还是先研究sort方法
public static void sort(List list) :将集合中元素按照默认的规则进行排序,那么默认的规则是怎么来的?
简单的来说进行元素的排序,其实就是两个对象之间比较大小,那么在Java中提供了两种比较实现方式,一种是比较死板的采用java.lang.Comparable接口去实现,一种是灵活的可以指定排序规则的java.util.Comparator接口完成。
那么我们采用的public static void sort(List list)这个方法完成的排序,实际上要求了呗排序的类型需要实现Comparable接口完成比较的功能
public final class Integer extends Number implements Comparable<Integer>
Integer类实现了这个接口,并完成了比较规则的定义,但是这样就把这种规则写死了,那比如我们想要降序排列,那么这就需要修改Integer的源代码,这是不可能的,那么这个时候我们可以使用:
public static <T> void sort(List<T> list, Comparator<? super T> c)
方法灵活的完成,这个方法里面就涉及到了Comparator这个接口,位于java.util包中,排序是Comparator能实现的功能之一,该接口代表一个比较器,比较器具有可比性,顾名思义就是做排序的,通俗地讲要比较两个对象谁排在前谁排在后,那么比较的方法就是:
- public int compare(T o1, T o2):比较两个参数的顺序
- 两个对象比较的结果有三种:大于,等于,小于
- 如果按照升序排列,则o1小于o2返回负数,相等返回0,o1大于o2返回正数;
- 如果按照降序排列,则o1小于o2返回正数,相等返回0,o1大于o2返回负数
package com.bdit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/*
Comparator比较器
*/
public class Test9 {
public static void main(String[] args) {
ArrayList<String> list2=new ArrayList<>();
list2.add("cba");
list2.add("abc");
list2.add("bca");
list2.add("123");
list2.add("true");
Collections.sort(list2, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//升序排列
// if(o1.charAt(0)<o2.charAt(0)){
// return -1;
// }else if(o1.charAt(0)==o2.charAt(0)){
// return 0;
// }else{
// return 1;
// }
//降序排列
if(o1.charAt(0)<o2.charAt(0)){
return 1;
}else if(o1.charAt(0)==o2.charAt(0)){
return 0;
}else{
return -1;
}
}
});
System.out.println(list2);
}
}
package com.bdit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/*
对自定义对象进行升序或降序排列
*/
public class Test10 {
public static void main(String[] args) {
ArrayList<Student> list=new ArrayList<>();
list.add(new Student(1001,"zhangsan"));
list.add(new Student(1002,"lisi"));
list.add(new Student(1003,"wangwu"));
list.add(new Student(1004,"haha"));
//根据id降序
//Collections.sort(list,new MyComparator1());
//根据name升序
Collections.sort(list,new MyComparator2());
for(Student stu:list){
System.out.println(stu);
}
}
}
//根据id降序排列的比较器
class MyComparator1 implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if(o1.getId()<o2.getId()){
return 1;
}else if(o1.getId()==o2.getId()){
return 0;
}else{
return -1;
}
}
}
//根据name 进行升序排列
class MyComparator2 implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if(o1.getName().charAt(0)<o2.getName().charAt(0)){
return -1;
}else if(o1.getName().charAt(0)==o2.getName().charAt(0)){
return 0;
}else{
return 1;
}
}
}
Comparable和Comparator接口的区别
Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo方法一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象可以通过Collection.sort()方法进行自动排序。
Comparator强行对某个对象进行整体排序,可以将Comparator传递给sort方法,从而允许在排序顺序上实现自定义控制。