4

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

4 に答える 4

4

メソッドをオーバーライドするたびに、@Overrideアノテーションを追加してください。メソッドのオーバーライドを間違えると、コンパイル エラーが発生します。これがここで発生しています。(の「生の」形式はmethod を宣言せず、 methodを宣言するため、間違っ実装しています。 ComparableComparable<T>compareTo(String)compareTo(Object)

Objectそのままコンパイルするには、 の代わりにを受け入れるか、 の代わりに実装する必要がありStringます。Comparable<String>Comparable

しかし、このような比較は対称的ではないため、ほとんどの場合、これは正しくありません。Word を文字列と比較することはできますが、文字列と単語を比較することはできません。

ほとんどの場合、 toComparable<Word>の代わりに実装Comparableして受け入れたいと考えています。WordcompareTo()

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

ただし、日付や数値のように、型が本質的に順序付けられている場合 (ドキュメントでは「自然順序」と呼ばれるものComparable) にのみ、これが適していることに注意してください。実際には 2 つの単語をアルファベット順に比較していないため (文字列の自然な順序に最も近い)、これは外部コンパレータを使用するためのより良い候補です。

//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());
    }
}
于 2012-02-04T04:15:05.807 に答える
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
    }
}
于 2012-02-04T04:16:24.860 に答える
1

ここでcompareToメソッドの署名を確認してください

そのはずint compareTo(Object o)

そしてあなたは与えているpublic int compareTo(String rhs)

@Overrideメソッドに注釈を追加することもできます。適切な署名に従っていない場合は、通知されます。

于 2012-02-04T04:14:22.667 に答える
0

短いバージョン: 代わりにComparator を取る Arrays.sort メソッドを使用する必要があります。

長いバージョン: 行

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>そのインスタンスを の 2 番目の引数として使用できますArrays.sort

于 2012-02-04T04:13:48.353 に答える