比较器(Comparator)
一、挽救的比较器:comparator
此比较器尽可能不用,作为理解。
comparable比较器核心价值是当一个类定义的时候就已经明确好了这个类的数据保存需要排序,但是多数情况下一个类设计的时候没有考虑到排序的需求。
如
class person {
private string name ;
private int age ;
public person(string name,int age){
super();
this.name = name;
this.age = age;
}
@override
Public string tostring(){
return“person [name=”+name+”,age=”+age+”]\n”;
}
Public int getAge() {
return age;
}
Public string getName() {
return name
}
}
这时无法用Arrays.sort()进行排序,但又必须用Arrays.sort(),可并不能修改person类,这时候的排序就属于挽救排序,必须更换为Java.util.comparator。
二、如何使用比较器comparator
在Java.util中找到comparator如图:
在此寻找equals如图:
一般函数接口只有一个方法,但此接口除了equals,还有compare,如图:
所以这个接口定义为:
@FunctionalInterface
public interface comparator<T> {
public int compare(T o1, To2);
public Boolean equals(object obj);
}
要想使用这个类,就要单独定义一个排序的子类,如下
Class personcomparator implements comparator<Person> {
@Override
Public int comper(person o1,person o2) {
If (o1.getAge() > o2. getAge()) {
return 1;
} else If (o1.getAge() < o2. getAge()) {
return -1;
}
return 0;
}
}
但排序的操作还是在Arrays类里面,只是换了一种新的方法,所以还是要在Arrays类找如图
此为排序方法为:
public static<T>void sort (T[]a,Comparator<?super T> c);
开始排序:
public class Testdemo {
public static void ,ain (string[] args) throws Exception {
person per [] = new person [] {
new person(“张三”,20),
new person(“李四”,19),
new person(“王五”,21),}; //对象组
Arrays.sort(per,new personComparator()); //要进行对象组的排序处理
System.out.println(Arrays.tostring(per));
}
}
这就完成了排序,比较而言comparable更方便。
三、面试题
请解释两种比较器的区别:
1、Java.lang.Comparable:在一个类定义时默认的接口,里面存有compareTo()方法;
2、Java.util.comparator:是挽救的比较接口,需要单独定义一个比较规则类,有compare()和equals()方法。
但此后用到最多的是Comparable,comparator更多的是在研究中用到的概念。