当前位置: 代码迷 >> java >> 如何定义方法 compareTo()?
  详细解决方案

如何定义方法 compareTo()?

热度:51   发布时间:2023-08-02 11:24:30.0

语境:

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

  1. SnakeCaseFormatter 将字符串(例如“Hello World”)转换为“hello_world”
  2. KebabCaseFormatter 将字符串(例如“Hello World”)转换为“hello-world”
  3. PascalCaseFormatter 将字符串(例如“HellO WoRld”)转换为“HelloWorld”

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

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

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

我假设您想比较格式化的值。 否则,就像@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,以便它可以对存储机制或每个类的细节保持通用。