我试图在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);
}
}
答案 0 :(得分:4)
帮自己一个忙:每次覆盖一个方法时,都要为它添加@Override
注释。如果你在覆盖方法时出错,这将给你一个编译错误,这就是这里发生的事情。您 实现错误,因为Comparable
(Comparable<T>
的“原始”形式未声明方法compareTo(String)
,它声明了方法{{1} }。
要按原样编译,您需要接受compareTo(Object)
而不是Object
或实施String
而不是Comparable<String>
。
但在大多数情况下这确实是不正确的,因为这种比较不是对称的:你可以将Word与String进行比较,但不能将String与单词进行比较。
您很可能希望实施Comparable
而非Comparable<Word>
,并接受Comparable
至Word
。
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
的第二个参数。