如何定义方法compareTo()?

问题描述 投票:1回答:1

语境:

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

  1. SnakeCaseFormatter转换字符串,例如“Hello World”到“hello_world”
  2. KebabCaseFormatter转换字符串,例如“你好世界”到“你好世界”
  3. PascalCaseFormatter转换字符串,例如“HellO WoRld”改编为“HelloWorld”

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

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

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

java priority-queue comparable
1个回答
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,以便它可以保持对存储机制或每个类的详细信息的通用性。

© www.soinside.com 2019 - 2024. All rights reserved.