Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何定义compareTo()方法?_Java_Priority Queue_Comparable - Fatal编程技术网

Java 如何定义compareTo()方法?

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

上下文:

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

  • SnakeCaseFormatter,可将字符串(例如“Hello World”)转换为“Hello_World”
  • KebabCaseFormatter,可将字符串(例如“Hello World”)转换为“Hello World”
  • PascalCaseFormatter,可将字符串(例如“HellO WoRld”)转换为“HelloWorld”
  • 当TextFormatter是一个接口时,这3种类型实现了可比性:

    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()代码在每种情况下都是相同的,那么您应该将其放入接口中,如我在第二个代码块中所示。