今天学习js的时候,当看到函数和数组这一块的时候,无意间看到了comparator这个词。而且其用法和java中的近乎一样。不由来了感慨啊。时间隔了那么久,现在对于java中之前用过的比较器也是模模糊糊了,现在特挑一个时间将其捡起。
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=红色]]可以看见,两种比较方式都是可行的
。知识有限,所以不能说的很清楚,还望各位读者大神们不要见笑。如果有什么不懂之处,或是在下写作的纰漏之处,还望能够批评指正。更希望能有人和我一同探讨学术问题,码字不易,如果瞧得上,望您点个赞!谢谢
新闻热点
疑难解答