1

TokenDoubleCounters (カスタム オブジェクト) の ArrayList を並べ替えようとしています。TokenDoubleCounter では、次のように equals と compareTo を実装しました。

public class TokenDoubleCounter implements Comparable<TokenDoubleCounter> {
private String word;
private double count;

public boolean equals(Object o) {
    if (o instanceof TokenDoubleCounter) {
        TokenDoubleCounter other = (TokenDoubleCounter) o;
        if (other.word.equals(this.word) && other.count == this.count)
            return true;
    }
    return false;
}

public int compareTo(TokenDoubleCounter other) {
    double result = this.count - other.getCount();
    if (result > 0.0) 
        return 1;
    if (result < 0.0) 
        return -1;
    return this.word.compareTo(other.getWord());
}

    //rest of class omitted
}

これらのオブジェクトは、次の関数呼び出しで作成およびソートされます。

    public List<TokenDoubleCounter> chiSquareValueAll(int cl, int cl2) {
    List<TokenDoubleCounter> list = new ArrayList<TokenDoubleCounter>();

    for (String word : map.keySet()) {
                                                        //chiSquareValue2 returns a double
        list.add(new TokenDoubleCounter(word, chiSquareValue2(cl,cl2,word)));       
    }
    Collections.sort(list, Collections.reverseOrder());
    return list;
}

最後に、これらの結果を反復処理して、これらをファイルに書き込みます。

    public boolean printChiSquare(PrintWriter out, int cl, int cl2) {
    for (TokenDoubleCounter tdc : this.chiSquareValueAll(cl,cl2)) {
        if (tdc.getCount() > 2.7) {
             //getWord() returns string value "word"  and getCount() returns double value "count"
            out.write(tdc.getWord() + "," + tdc.getCount() + "\n");

        }
    }
    return true;
}

結果は、私が要求した順序ではないように思われるため、私にとってはやや驚くべきものでした。

word,8.937254901960785
word,8.937254901960785
word,8.937254901960785
word,5.460792811839323
word,4.746170542635659
word,4.382692307692308
word,4.382692307692308
word,4.382692307692308
word,4.382692307692308
word,4.382692307692308
word,4.382692307692308
word,4.382692307692308
word,8.937254901960785
word,8.937254901960785
word,8.937254901960785
word,8.937254901960785
word, 8.937254901960785
ワード、8.937254901960785
ワード、8.937254901960785
ワード、5.460792811839323
ワード、4.746170542635659
ワード、4.746170542635659
単語,4.746170542635659
単語,4.382692307692308
...

私は何が欠けていますか?また、追加の詳細が必要な場合はお知らせください。

また、すべてのエントリ「単語」は実際にはさまざまな長さの文字列などであることを付け加える必要がありますが、それは関係ないと思います。

助けてくれてありがとう。

4

2 に答える 2

3

これを試して:

public int compareTo(TokenDoubleCounter other) {
    int result = Double.compare(count, other.count);
    return result != 0 ? result : word.compareTo(other.word);
}
于 2012-05-02T21:59:53.777 に答える
0

コンパレーターは、-1、0、1 だけを返す必要はありません。代わりに、カウント間の差を使用して大きさを作成することを検討することもできます (それがデータにとって意味がある場合)。次に、アイテムは相対的な順序に基づいて配置されます。

同じ比較結果を持つ一連のアイテムになってしまい、その場合は挿入順序が維持されると思います。

于 2012-05-02T21:48:00.507 に答える