compareTo()方法在使用Comparable接口时不会覆盖默认方法

时间:2012-02-04 04:11:37

标签: java interface comparable compareto

我试图在java中覆盖默认的compareTo()方法,编写我自己的并使用类似的工具,但似乎java仍然使用默认方法。

我正在尝试按照从.dat文件中获取的字符串数组进行排序,但是它会按字母顺序对其进行排序。如果有人能告诉我我做错了什么,我会很感激,因为我无法弄清楚为什么这不起作用。

由于

import static java.lang.System.*;
import java.util.Arrays;

public class Word implements Comparable
{
private String word;
private String[] array;

public Word()
{
    word = "";
}

public Word(String s)
{
    word = s;
}

public void setWord(String s)
{
    word = s;
}

public int compareTo(String rhs)
{
    String temp = (String)rhs;
    if(word.length() > temp.length())
        return 1;
    else if(word.length() < temp.length())
        return -1;

    return 0;
}

public void setSize(int size)
{
    array = new String[size];
}

public void add(int spot, String other)
{
    array[spot] = other;
}

public String[] sortByLength()
{
    Arrays.sort(array);
    return array;
}
public String toString()
{
    return Arrays.toString(array);
}
}

这是包含main方法的类

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.Arrays;
import static java.lang.System.*;

public class Lab18d
{
public static void main( String args[] ) throws IOException
{
    Scanner file = new Scanner(new File("lab18d.dat"));

    int size = file.nextInt();
    file.nextLine();
    Word test = new Word();
    test.setSize(size);
    String word = "";

    for(int i = 0; i < size; i++)
    {
        word = file.next();
        test.setWord(word);
        test.add(i, word);
    }
    test.sortByLength();
    System.out.println(test);
}
}

4 个答案:

答案 0 :(得分:4)

帮自己一个忙:每次覆盖一个方法时,都要为它添加@Override注释。如果你在覆盖方法时出错,这将给你一个编译错误,这就是这里发生的事情。您 实现错误,因为ComparableComparable<T>的“原始”形式未声明方法compareTo(String),它声明了方法{{1} }。

要按原样编译,您需要接受compareTo(Object)而不是Object或实施String而不是Comparable<String>

但在大多数情况下这确实是不正确的,因为这种比较不是对称的:你可以将Word与String进行比较,但不能将String与单词进行比较。

您很可能希望实施Comparable而非Comparable<Word>,并接受ComparableWord

compareTo()

注意虽然@Override public int compareTo(Word other) { String temp = other.word; //... } 只是一个非常适合的类型是本质上订购(文档称之为“自然顺序”),如日期或数字。由于您实际上并没有按字母顺序比较这两个单词(最接近String的自然顺序),因此这是使用外部比较器的更好选择。

Comparable

答案 1 :(得分:2)

输入了

Comparable,但您使用的是原始类型。试试这个:

public class Word implements Comparable<Word> { // Note: typing of Comparable
    ...

    public int compareTo(Word rhs) { // Note: parameter is typed
        String temp = rhs.word;
        return word.length() - temp.length(); // Note: Simplification of code
    }
}

答案 2 :(得分:1)

检查compareTo方法here

的签名

应为int compareTo(Object o)

你正在给public int compareTo(String rhs)

您还可以在方法中添加@Override注释。如果您没有遵循正确的签名,它会通知您。

答案 3 :(得分:0)

简短版本:您需要改为使用Arrays.sort method taking a Comparator

长版:行

Arrays.sort(array);
sortByLength方法中的

一直在对它排序的对象调用compareTo方法 - 这些对象都是字符串!相反,你需要行

Arrays.sort(array, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        if (s1.length() > s2.length())
            return 1;
        if (s1.length() < s2.length())
            return -1;

        return 0;
    }
});

或者您可以创建一个实现Comparator<String>的单独类,并使用该实例作为Arrays.sort的第二个参数。