如何定义方法 compareTo()?

Posted

技术标签:

【中文标题】如何定义方法 compareTo()?【英文标题】:How to define method compareTo()? 【发布时间】:2019-02-22 05:23:07 【问题描述】:

上下文:

我有 3 种不同类型的文本格式化程序:

    SnakeCaseFormatter 转换字符串,例如“Hello World”到“hello_world” KebabCaseFormatter 转换字符串,例如“Hello World”到“hello-world” PascalCaseFormatter 转换字符串,例如“Hello World”到“HelloWorld”

这 3 种类型实现了 Comparable,其中 TextFormatter 是一个接口:

interface TextFormatter  
  public TextFormatter clone(String s);
  public String format();

如何实现 compareTo() 方法,以便 compareTo(TextFormatter o) 方法将当前对象与另一个对象进行比较;如果它在另一个对象之前返回一个负数,如果它在另一个对象之后返回一个正数,如果它们被认为是相同的顺序则返回0?

【问题讨论】:

子类中是否添加了值属性?你在比较哪些领域?它们都只有一个需要比较的字符串字段吗? String 已经实现了 Comparable。你想达到什么目标? 我要比较格式化的值! @Cheryl,那么这个答案对你有用吗? 是的,非常感谢! :) 【参考方案1】:

我假设您想比较格式化的值。否则,就像@Mohamed 所说,可以比较字符串本身。这将比较格式化的值:

interface TextFormatter 
    public TextFormatter clone(String s);
    public String format();


class SnakeCaseFormatter implements TextFormatter, Comparable<TextFormatter> 

    ...

    @Override
    public int compareTo(TextFormatter other) 
        return format().compareTo(other.format());
    

你可以把这个方法放在你的界面中,因为 Java 的更新版本:

interface TextFormatter extends Comparable<TextFormatter> 
    TextFormatter clone(String s);
    String format();

    @Override
    default int compareTo(@NotNull TextFormatter other) 
        return format().compareTo(other.format());
    

顺便说一句,您的界面中不需要“公共”限定符。接口中的方法签名必须是公开的,所以这是多余的。

为方便起见,也许您确实想比较原始字符串。这并不疯狂。不过,我无法为您编写该方法,因为我不知道您如何存储字符串。您可以在我提供的代码中将它们的值替换为“format()”,但您希望接口中有一个 getter,以便它可以保持对存储机制或每个类的详细信息的通用性。

【讨论】:

如果我在它们各自的格式化程序类中创建方法,我是否仍需要在我的接口 TextFormatter 中扩展 Comparable 或者我可以保留我的初始接口吗? 把它放在你的界面中的原因是如果你有一个TextFormatter类型的通用指针。如果您不将定义放在界面中,使用它的代码将不知道下面的对象可以执行 compareTo()。 - 如果您使用的是 Java 8 或更高版本,并且 compareTo() 代码在每种情况下都是相同的,那么您应该将它放在您的界面中,就像我在第二个代码块中显示的那样。

以上是关于如何定义方法 compareTo()?的主要内容,如果未能解决你的问题,请参考以下文章

compare()和compareTo()区别

对象比较器:Comparable和Comparator

(1/2)JAVA中comparable中比较字符串的compareTo()方法与比较器comparator的字符串compareTo()方法有

comparable的compareTo( )方法 日常

Comparable接口的compareTo()方法

String类中自动重写compareTo( )方法对汉字的比较