繁体   English   中英

如何实现可比接口以及为什么要实现它

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM