[英]How to Implement the Comparable Interface and Why Should We Implement It
重写Comparable接口的compareTo()方法的最佳方法是什么? 另外,当我们可以编写自己的compareTo()方法而无需实现时,为什么还要实现Comparable接口。 以以下Seat类为例:
public class Seat {
private final String seatNumber;
private double price;
public Seat(String seatNumber, double price) {
this.seatNumber = seatNumber;
this.price = price;
}
public int compareTo(Seat seat) {
return this.seatNumber.compareToIgnoreCase(seat.getSeatNumber());
}
}
即使我们没有实现Comparable接口,上述方法仍然有效,那么为什么还要实现它呢?
当我们可以编写自己的compareTo()方法而无需实现时,为什么需要实现Comparable接口
以Collections.sort
为例。 签名是
public static <T extends Comparable<? super T>> void sort(List<T> var0)
通用类型参数意味着我们只能对与自身(或子类型)可比的事物列表进行排序。 例如,我们可以对字符串列表进行排序,因为String
实现了Comparable<String>
。 也就是说,一个字符串知道它应该自然落在另一个字符串之前还是之后。
没有接口来定义此约束,此方法将不存在。
重写Comparable接口的compareTo()方法的最佳方法是什么?
这完全取决于您正在使用的课程。 如果它没有明确的自然顺序,那么也许您不应该这样做。 座位可以按数量或价格排序。 随意选择一个并不一定有意义。
因此,通常使用上述Collections.sort
来提供第二个签名,该签名需要使用Comparator
:
public static <T> void sort(List<T> var0, Comparator<? super T> var1)
这意味着我们不必随意定义座位是自然地按编号还是按价格订购的。 我们可以有一段代码,它使用一个比较器按价格排序,而另一段完全独立的代码,使用另一个比较器按座位号排序。
实现Comparable
一个好处是,您不必像使用Comparator
那样公开内部类的详细信息即可确定实例的顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.