Java 如何定义compareTo()方法?
上下文: 我有3种不同类型的文本格式化程序:Java 如何定义compareTo()方法?,java,priority-queue,comparable,Java,Priority Queue,Comparable,上下文: 我有3种不同类型的文本格式化程序: SnakeCaseFormatter,可将字符串(例如“Hello World”)转换为“Hello_World” KebabCaseFormatter,可将字符串(例如“Hello World”)转换为“Hello World” PascalCaseFormatter,可将字符串(例如“HellO WoRld”)转换为“HelloWorld” 当TextFormatter是一个接口时,这3种类型实现了可比性: interface TextForma
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());
}
}
接口文本格式化程序{
公共文本格式化程序克隆(字符串s);
公共字符串格式();
}
类SnakeCaseFormatter实现TextFormatter,类似{
...
@凌驾
公共整数比较(文本格式化程序其他){
返回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());
}
}
接口文本格式化程序扩展{
TextFormatter克隆(字符串s);
字符串格式();
@凌驾
默认int compareTo(@NotNull TextFormatter other){
返回format().compareTo(other.format());
}
}
顺便说一句,您的界面中不需要“public”限定符。接口中的方法签名必须是公共的,所以这是多余的
为了方便起见,您可能确实希望比较原始字符串。这并不疯狂。但我不能为您编写该方法,因为我不知道您是如何存储字符串的。在我提供的代码中,您可以将它们的值替换为“format()”,但您希望接口中有一个getter,这样它就可以对存储机制或每个类的详细信息保持通用性。是否有任何值属性添加到子类中?你在比较哪些领域?它们是否都只有一个需要比较的字符串字段?字符串已经实现了Comparable。您想要实现什么?我想要比较格式化的值@谢丽尔,那么这个答案对你有用吗?是的,非常感谢!)如果我在它们各自的格式化程序类中创建方法,我是否仍然需要在我的接口TextFormatter中扩展Comparable,或者我是否可以保持初始接口不变!将它放在接口中的原因是如果您有一个TextFormatter类型的通用指针。如果不将定义放在接口中,使用它的代码不会知道下面的对象可以执行compareTo()如果您使用的是Java 8或更高版本,并且compareTo()代码在每种情况下都是相同的,那么您应该将其放入接口中,如我在第二个代码块中所示。