Comparator比较器
Collcetion工具集中的sort()
public static <T> void sort(List<T> list)
public static <T> void sort(List<T> list,Comparator<? super T> c)
Comparator接口在java.util包下面,排序是Comparator需要实现的功能之一,该接口代表的是一个比较器,具有可比性,可以做排序,本质是比较两个对象谁排前面谁排在后面。
public int compare(Object o1,Object o2) : 比较两个参数的顺序
比较结果:大于、等于、小于
如果升序排序:则o1小于o2返回(负数),相等返回0,大于返回(正数)
如果降序排序:则o1小于o2返回(正数),相等返回0,大于返回(负数)
简化操作:
升序:o1-o2
降序: o2-o1
示例:
public static void main(String[] args) {
//public static <T> void sort(List<T> list)
ArrayList<String> list = new ArrayList<>();
list.add("abc");
list.add("cba");
list.add("bca");
list.add("sba");
list.add("nba");
// 排序规则,按照字符串的第一个字母降序排序
// 使用接口中的方法:
// public static <T> void sort(List<T> list,Comparator<? super T> c)
// public int compare(Object o1,Object o2):比较两个参数的的顺序
Collections.sort(list,new Comparator(){
@Override
public int compare(String o1,Strng o2) {
/*if(o2.charAt(0) - o1.charAt(0) > 0){
return 1;
} else if ( o2.charAt(0) - o1.charAt(0) == 0){
return 0;
} else {
return -1;
}*/
return o2.charAt(0) - o1.charAt(0);
}
});
System.out.println(list);
}
// 控制台结果:
[sba,nba,cba,bca,abc]
简述Comparable和Comparator两个接口的区别
Comparable:强行对实现他的每个类对象进行整体排序。这种排序我们一般称为自然排序,comparaTo()被称为它的自然比较方法。只能在类中实现comparaTo()方法一次,不能经常修改类的代码实现自己想要的排序。 实现此接口的对象列表(和数组)可以通过Collections.sort()(和Arrays.sort())进行自动排序,对象可以用作有序映射中的键或者有序集合中的元素,无序指定比较器。
Comparator:强行对某个对象进行整体排序。可以将Comparator传递给sort()方法(如Collections.sort()后者Arrays.sort()),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(有序的set或者是有序的映射)的顺序,或者为那些没有自然顺序的对象Collection提供排序。
示例:
package comparator;
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 +
'}';
}
}
package comparator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class MainClass {
public static void main(String[] args) {
// 假如学生都是老外 名字都是字母
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("tom",20));
list.add(new Student("lily",18));
list.add(new Student("jack",26));
list.add(new Student("rose",40));
list.add(new Student("smith",26));
// 按照年龄升序排序
// 如果年龄相同的话,然后按照姓名排序,按照姓名的首字母降序排序
Collections.sort(list,new Comparator<Student>(){
@Override
public int compare(Student o1,Student o2) {
int num = o1.getAge() - o2.getAge();
if( num == 0) {
num = o2.getName().charAt(0) - o1.getName().charAt(0);
}
return num;
}
});
System.out.println(list);
}
}