1

aとaを<Integer,Double>使用してタイプのハッシュマップを並べ替えようとしていますが、sの絶対値で並べ替えたいのですが、符号値も保持したいのです(したがって、unsignedとして保存しません)。TreeMapSortedMapDoubleDouble

以下は私が使用しているコードですが、おそらくhashcode()これを修正する方法を誰かが指摘できるのを使用しているため、期待する値が得られません。

Map<Integer,Double> termWeights = new HashMap<Integer,Double>();    
SortedMap sortedData = new TreeMap(new ValueComparer(termWeights));
System.out.println(termWeights);
sortedData.putAll(termWeights);
System.out.println(sortedData);

class ValueComparer implements Comparator {
    private Map _data = null;

    public ValueComparer(Map data) {
        super();
        _data = data;
    }

    public int compare(Object o1, Object o2) {
        Double e1 = Math.abs((Double) _data.get(o1));
        Double e2 = Math.abs((Double) _data.get(o2));
        int compare = e2.compareTo(e1);
        if (compare == 0) {
            Integer a = o1.hashCode();
            Integer b = o2.hashCode();
            return b.compareTo(a);
        }
        return compare;
    }
}

ありがとう

4

1 に答える 1

1

期待される結果と実際の結果の例を挙げていただけますか?

ソートされたマップ:{17 = 1.644955871228835、0 = -1.029545248153297、10 = -5.291765636407169E-4、9 = -3.331976978545177E-4、1 = -2.7105555587851366E-4、2 = -2.7105555587851366E-4、7 = -2.0897436261984377E -4、8 = -1.305197184270594E-5、3 = 0.0、4 = 0.0、5 = 0.0、6 = 0.0、11 = 0.0、12 = 0.0、13 = 0.0、14 = 0.0、15 = 0.0、16 = 0.0 、18 = 0.0、19 = 0.0、20 = 0.0、21 = 0.0、22 = 0.0}

では、何が問題なのでしょうか。

それは最大から最小に正しくソートされているように見えます。

ただし、タイブレークセカンダリコンパレータでhashCodeを使用することは避けます。これは、異なる入力に対して同じ値を返さないようにする必要があるためです。この場合、hashCodeが同じintを返す整数で呼び出しているため、機能します。ただし、マップでLongキーまたはStringキーを使用した場合、衝突が発生します。代わりに、2つのキーを直接比較してください。

そして最後に、コンパレータの使用を開始した後に重みを変更してはなりません。これにより、TreeMapに一貫性がなくなります。

于 2012-09-12T01:23:52.033 に答える