以前面试经常会有人问,如果一个类想比较怎么办?
答:实现Comparable接口 复写 compareTo方法。。。
package java.lang; public interface Comparable<T> { int compareTo(T arg0); }
上面的是Comparable接口jdk源码,个人认为我们要对一个类的对象进行比较,不一定非要实现这个接口,因为这个接口只是定义了一个方法名称,啥都没干,具体的实现还是要我们在需要比较的类中进行实现的,唯一可能有问题的就是,自己写的比较方法在用Collections.sort的时候会有问题,因为这些方法要求的入参需要实现Comparable 或者 Comparator 接口
排除上述的情况,个人认为我们可以随便写啊,比较方法想叫什么名称就叫什么名称~想返回什么值就返回什么值,你认为呢?
理论上当然是可以的,真是实现已经提供的接口更方便而已。
sorry!以为是C#
java里是 comparetor 接口
是的~
可以另外写个类实现ICompare 比较器接口,调排序方法时,传比较器对象进去。
嗯,我知道你的意思,写个类实现comparetor 接口,调用public static <T> void sort(List<T> arg, Comparator<? super T> arg0) 这个方法,我不是想问这个。。。
我就是有个想法,实现类比较的时候,我自己写一个方法,不用实现任何接口~~~在某些特定的情况下也是可以的!
@队长给我球。:
参见Cai 同学的回答,在#里,可以用匿名方法或者lamda表达式
JAVA里没有匿名方法,可以使用匿名内部类代替。
@队长给我球。:
你自己写个方法,实现两个对象比较大小的逻辑,供数组或集合的sort来调用,没错。
这个其实叫做 策略模式。
唯一的问题就是,你写的这个方法要怎样才能被传给给框架的sort方法。
用自己另外写的比较器类,实现比较器接口,把这个比较器类的实例作为参数传递给sort方法,其实就是为了把你写的方法传递给sort。
单独定义实现比较器的类或者匿名内部类,来实现把比较方法当成sort方法的参数传递,这样显得麻烦。但是这样可以实现比较逻辑的动态替换(运行时指定而不是在编译时),这才是搞这么复杂的意义所在。
如果要简单,而且确信比较的逻辑可以写死,那么用lamda表达式或者匿名内部类或者匿名方法就干脆得多。
但是代价是,丧失了策略模式在运行时的灵活性。
@西漠以西: 谢谢
如果你不实现Comparable接口,的确就没办法使用jdk的一些方法(比如你说的Collections.sort),因为根本就不清楚怎么去比较。
如果你不想实现是可以用匿名内部类或者1.8后面的lambda来实现,比如
Collections.sort(yourList,new Comparator<T>(){
@Override
public int compare(T t1,T t2){
return t1.hashCode()-t2.hashCode();
}
});
Collections.sort(yourList,(p1,p2)->p1.hashCode()-p2.hashCode());
谢谢