如何定义方法compareTo()?

时间:2019-02-22 05:23:07

标签: java priority-queue comparable

上下文:

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

  1. SnakeCaseFormatter,用于转换字符串,例如从“ Hello World”到“ hello_world”
  2. KebabCaseFormatter可转换字符串,例如从“ Hello World”到“ hello-world”
  3. PascalCaseFormatter,用于转换字符串,例如“ HellO WoRld”到“ HelloWorld”

,这三种类型在TextFormatter是接口的情况下实现了Comparable:

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

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

1 个答案:

答案 0 :(得分: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()”,但是您希望在接口中使用吸气剂,以使其对存储机制或每个类的细节保持通用。