gpt4 book ai didi

java - 使用 Comparable 接口(interface)时,compareTo() 方法未覆盖默认方法

转载 作者:搜寻专家 更新时间:2023-11-01 01:55:58 25 4
gpt4 key购买 nike

我试图通过编写自己的并使用可比较的实现来覆盖 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);
}
}

这是包含主要方法的类

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);
}
}

最佳答案

帮自己一个忙:每次覆盖方法时,添加 @Override注释它。如果您在覆盖该方法时犯了错误,这将给您一个编译错误,这就是这里发生的情况。您实现错误,如Comparable (Comparable<T> 的“原始”形式不声明方法 compareTo(String) ,它声明方法 compareTo(Object)

要让它按原样编译,您需要接受 Object而不是 String或实现 Comparable<String>而不是 Comparable .

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

您很可能想实现 Comparable<Word>而不是 Comparable并接受 WordcompareTo() .

@Override
public int compareTo(Word other)
{
String temp = other.word;
//...
}

请注意 Comparable仅当类型按本质上排序(文档称为“自然顺序”)如日期或数字时才非常适合。由于您实际上并没有按字母顺序比较这两个词(这将最接近字符串的自然顺序),因此这是使用外部比较器的更好选择。

//since Word.word is a private member, this either needs to be nested inside of Word
//or Word.word would need to be given an accessor method
public static class LengthComparator implements Comparator<Word> {
@Override
public int compare(Word word1, Word word2) {
return Integer.valueOf(word1.word.length()).compareTo(word2.word.length());
}
}

关于java - 使用 Comparable 接口(interface)时,compareTo() 方法未覆盖默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9138327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com