首页 新闻 会员 周边 捐助

类比较一定要实现Comparable接口???我自己写一个不行?

0
[已解决问题] 解决于 2018-01-24 17:06

以前面试经常会有人问,如果一个类想比较怎么办?

答:实现Comparable接口 复写 compareTo方法。。。

package java.lang;

public interface Comparable<T> {
int compareTo(T arg0);
}  

上面的是Comparable接口jdk源码,个人认为我们要对一个类的对象进行比较,不一定非要实现这个接口,因为这个接口只是定义了一个方法名称,啥都没干,具体的实现还是要我们在需要比较的类中进行实现的,唯一可能有问题的就是,自己写的比较方法在用Collections.sort的时候会有问题,因为这些方法要求的入参需要实现Comparable 或者 Comparator 接口

排除上述的情况,个人认为我们可以随便写啊,比较方法想叫什么名称就叫什么名称~想返回什么值就返回什么值,你认为呢?

队长给我球。的主页 队长给我球。 | 菜鸟二级 | 园豆:324
提问于:2018-01-22 17:07
< >
分享
最佳答案
0

理论上当然是可以的,真是实现已经提供的接口更方便而已。

奖励园豆:5
Arthurian | 小虾三级 |园豆:1123 | 2018-01-22 17:26

sorry!以为是C#

 

java里是 comparetor 接口

西漠以西 | 园豆:1675 (小虾三级) | 2018-01-22 17:41

是的~

队长给我球。 | 园豆:324 (菜鸟二级) | 2018-01-22 17:47
其他回答(2)
0

可以另外写个类实现ICompare 比较器接口,调排序方法时,传比较器对象进去。

西漠以西 | 园豆:1675 (小虾三级) | 2018-01-22 17:40

嗯,我知道你的意思,写个类实现comparetor 接口,调用public static <T> void sort(List<T> arg, Comparator<? super T> arg0)  这个方法,我不是想问这个。。。

我就是有个想法,实现类比较的时候,我自己写一个方法,不用实现任何接口~~~在某些特定的情况下也是可以的!

支持(0) 反对(0) 队长给我球。 | 园豆:324 (菜鸟二级) | 2018-01-22 17:47

@队长给我球。: 

参见Cai 同学的回答,在#里,可以用匿名方法或者lamda表达式

JAVA里没有匿名方法,可以使用匿名内部类代替。

支持(0) 反对(0) 西漠以西 | 园豆:1675 (小虾三级) | 2018-01-23 00:05

@队长给我球。: 

你自己写个方法,实现两个对象比较大小的逻辑,供数组或集合的sort来调用,没错。

这个其实叫做 策略模式。

唯一的问题就是,你写的这个方法要怎样才能被传给给框架的sort方法。

用自己另外写的比较器类,实现比较器接口,把这个比较器类的实例作为参数传递给sort方法,其实就是为了把你写的方法传递给sort。

单独定义实现比较器的类或者匿名内部类,来实现把比较方法当成sort方法的参数传递,这样显得麻烦。但是这样可以实现比较逻辑的动态替换(运行时指定而不是在编译时),这才是搞这么复杂的意义所在。

 

如果要简单,而且确信比较的逻辑可以写死,那么用lamda表达式或者匿名内部类或者匿名方法就干脆得多。

但是代价是,丧失了策略模式在运行时的灵活性。

 

支持(0) 反对(0) 西漠以西 | 园豆:1675 (小虾三级) | 2018-01-23 00:19

@西漠以西: 谢谢

支持(0) 反对(0) 队长给我球。 | 园豆:324 (菜鸟二级) | 2018-01-24 15:41
0

如果你不实现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());

Daniel Cai | 园豆:10424 (专家六级) | 2018-01-22 18:33

谢谢

支持(0) 反对(0) 队长给我球。 | 园豆:324 (菜鸟二级) | 2018-01-24 15:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册