簡體   English   中英

使用double的絕對值對HashMap進行排序

[英]Sorting HashMap using absolute values of doubles

我正在嘗試使用TreeMapSortedMap對類型為<Integer,Double>的哈希圖進行排序<Integer,Double>我想對Double的絕對值進行排序,但我也想保留符號值(因此不存儲為未簽名的Double ) 。

以下是我正在使用的代碼,但是我沒有得到我期望的值,大概是由於使用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;
    }
}

謝謝

您能否舉一個預期和實際結果的例子?

排序圖:{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,因為您需要它永遠不要為不同的輸入返回相同的值。 在這種情況下,它是可行的,因為您是在Integer上調用它的,其中hashCode僅返回相同的int。 但是,如果您在地圖中使用了Long或String鍵,則會發生沖突。 而是直接比較兩個鍵。

最后,在開始使用比較器后,一定不要更改權重。 這將導致不一致的TreeMap。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM