您的位置:首页 > 编程语言 > Java开发

java中关于比较器comparator和comparable

2017-02-07 20:57 211 查看
今天学习js的时候,当看到函数和数组这一块的时候,无意间看到了comparator这个词。而且其用法和java中的近乎一样。不由来了感慨啊。时间隔了那么久,现在对于java中之前用过的比较器也是模模糊糊了,现在特挑一个时间将其捡起。

比较器的作用

要想知道比较器怎么写,首先肯定得知道这个东东到底有什么用,是做什么的?有没有必要花很长时间去学习它?(原谅我功利的心)其实也正如大家所想一样,比较器的作用肯定是非常大的!只要涉及到对象之间的比较或是自定的比较,想要代码规范一点的话,就得用到比较器。很简单的例子,比如两个人比较,你说谁更厉害?高?矮?知识?什么知识?肯定得有一个明确的比较对象的!这时候肯定得自定义一个比较器。基本上可以说,比较器的使用是每一个编程人员所必备的知识。
说了那么多,大家肯定早已等不急想要看看比较器怎么写了吧?哈哈哈,不急不急。学东西要循序进进,我们得知道其原理!

比较器源码

学一个东西,我们应该尽量明白其原理,而看源码无疑是一种非常好的学习习惯。而且正好比较器的源码也非常简单!毕竟比较器就是一个接口。让我们一个一个看:
comparator:
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
这是jdk定义的第一种比较器接口。可以看到,这个比较器就只有两种方法,一个是compare(T o1,T o2);返回时int(注释太长我就不复制了,这里本人解释一下)。该方法表示传进去两个对象(都是T,同一个对象。T是泛型代,可以表任何类名),然后自定义比较的方法,同时返回结果。结果一般定义为:-1,0,1(为了规范)。分别代表大于,等于,小于。而想要让这个比较器生效,我们一般是专门定义一个共比较的公共比较类。然后再调用专门的sort(list,comparator)排序方法进行比较。
comparable:
public interface Comparable<T> {
public int compareTo(T o);
}
大家从这个接口中可以发现,这个接口也拥有一个比较的方法comparaTo(T o),但是很奇怪,这个方法只传了一个参数!我们仔细想一下,如果这个方法也传连个参数,那么jdk为什么还专门将他们定义为两个方法呢?仔细想一下之后,大家就明白了,原来这个方法是供比较类的内部使用的!什么意思?就是说我这个类实现了这个接口,然后重写了compareTo(T o)方法,就相当于是说这个类拥有了和别人比较的量尺,然后他就可以用自己的量尺去和别人比较了。对比起来,comparator接口相当于是第三方的量尺,用来比较两个过来要比较的人。
源码讲了那么多,我们直接上实力代码吧!想必大家也早就等不及了,哈哈。

例子

entity类:
Cat类:
package com.wxp.comparatortest;

public class Cat {
private int age;
private String color;
private double height;

public Cat() {
}

public Cat(int age, String color, double height) {
super();
this.age = age;
this.color = color;
this.height = height;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color = color;
}

public double getHeight() {
return height;
}

public void setHeight(double height) {
this.height = height;
}
//重写toString便于遍历出list的时候查看元素是否已经排序
@Override
public String toString() {
return "Cat [age=" + age + ", color=" + color + ", height=" + height
+ "]";
}

}


定义comparator的类:

package com.wxp.comparatortest;

import java.util.Comparator;

public class CatComparator implements Comparator<Cat> {

public int compare(Cat o1, Cat o2) {
int age1 = o1.getAge();
int age2 = o2.getAge();
return age1>age2?1:(age1==age2?0:-1);
}

}


用于自身内部比较的comparable的类:
package com.wxp.comparatortest;

public class Dog implements Comparable<Dog>{
private int age ;
private String color;
public Dog() {
}
public Dog(int age, String color) {
super();
this.age = age;
this.color = color;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}

public int compareTo(Dog dog) {
return age>dog.age?1:(age==dog.age?0:-1);
}
@Override
public String toString() {
return "Dog [age=" + age + ", color=" + color + "]";
}

}


测试用的app类

package com.wxp.comparatortest;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Demo01 {
public static void main(String[] args) {
List<Cat> list = new ArrayList<Cat>();
list.add(new Cat(5, "red", 1.2));
list.add(new Cat(2, "blue", 2.5));
list.add(new Cat(3, "钛合金色", 3.4));
Collections.sort(list,new CatComparator());
System.out.println(list);

List<Dog> dogList = new ArrayList<Dog>();
dogList.add(new Dog(4, "红色"));
dogList.add(new Dog(3,"bluesky"));
dogList.add(new Dog(7, "红色"));
dogList.add(new Dog(1,"bluesky"));
Collections.sort(dogList);
System.out.println(dogList);
}
}


输出结果:

[Cat [age=2, color=blue, height=2.5], Cat [age=3, color=钛合金色, height=3.4], Cat [age=5, color=red, height=1.2]]

[Dog [age=1, color=bluesky], Dog [age=3, color=bluesky], Dog [age=4, color=红色], Dog [age=7, color=红色]]

可以看见,两种比较方式都是可行的



知识有限,所以不能说的很清楚,还望各位读者大神们不要见笑。如果有什么不懂之处,或是在下写作的纰漏之处,还望能够批评指正。更希望能有人和我一同探讨学术问题,码字不易,如果瞧得上,望您点个赞!谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息