0

私は Java の初心者で、 Comparable インターフェースの compareTo メソッドをオーバーライドするのに問題があります。私のコードは、文字列を int に関連付ける HashMap を作成します。ArrayList キーの文字列がアルファベット順ではなく HashMap 値に基づいてソートされるように、compareTo をオーバーライドしたいと思います。ただし、この実装では、文字列は依然としてアルファベット順にソートされています。

ああ、明確にするために、nameWeight は String,Integer ペアの HashMap です。

何か案は?

List<String> keys = new ArrayList<String>(nameWeight.keySet());
System.out.println(keys);
Collections.sort(keys);


public int compareTo(String that){
    int gtr = 1;
    int less = -1;
    int eql = 0;
    System.out.print(this);
    System.out.print(that);
    if(that=="JOHN")
        return less;
    int valThis = nameWeight.get(this);
    int valThat = nameWeight.get(that);
    if(valThis==valThat)
        return eql;
    if(valThis>valThat)
        return gtr;
    if(valThis<valThat)
        return less;
    return gtr;


}
4

1 に答える 1

0

呼び出されるメソッドがクラス(またはそのスーパークラス)compareToで定義されているメソッドになるように、文字列のリストを並べ替えています。String変更できないため、String のサブクラスを作成し、そのクラスStringでオーバーライドして を使用する必要があります。しかし、それからサブクラス化することは許可されていないためです(@pstに感謝します)。compareToList<StringSubClass>Stringfinal

Stringまたは、リスト内のオブジェクトを使用するのではなく、作成したタイプのオブジェクトを使用してオーバーライドします (クラス定義compareToに追加することを忘れないでください)。implements Comparable

または(@pstからの恥知らずなプラグイン)、そしておそらくそれが最良の解決策sortです。デフォルトの実装の代わりに、文字列をソートするために使用される関数にコンパレータを渡します。

于 2013-02-09T22:41:18.777 に答える