2012-07-26 25 views
8

正如在Double in HashMap的答案中所述,不應該在HashMaps中使用雙精度,因爲它們難以進行平等比較。我相信我的情況是不同的,但我想我會要求確保,因爲我沒有看到任何關於此事的信息。我應該在TreeMap中使用Double作爲鍵嗎?

我將有一系列與對象關聯的double值,並且我希望它們按double值排序。 TreeMap是一個合適的解決方案嗎?會有更好的嗎? double值會產生一堆數學,所以重複值的可能性非常低。

編輯:我應該澄清一點:我需要的是讓這個對象列表按照與它們相關的雙打排序。雙打的值將被放棄,我永遠不會叫map.get(key)

+0

聽起來你應該是安全的。您可能會添加一些欺騙性因素處理,以防止重複發生,以防萬一。 – Wug 2012-07-26 19:24:23

回答

13

雙打不應該包含HashMap中使用,因爲他們是很難比較平等。

  • 將你曾經嘗試get值基礎上的某些鍵?

    • 如果,則關於「難以比擬」的道理也適用,你或許應該避免這樣的數據結構(或總是依靠tailMap/headMap/submap並獲取地圖的範圍)。

    • 如果沒有(即您通常只是做for (Double key : map.keySet()) ...或遍歷entrySet),那麼我將你沒事使用Double作爲鍵說。

雙值生成一束的數學,所以重複的值的可能性極低。

  • 它是一個錯誤如果你真的得到重複?

    • 如果那麼它是不正確的數據結構使用。你可以使用Guava的Multimap

    • 如果(即它映射到的兩個值中的哪一個並不重要,因爲它們只能相差一個小的epsilon),那麼你應該沒問題。

+0

這是完美的。我的兩個答案都是「不」,所以我很好走。 – MalcolmOcean 2012-07-26 19:50:01

1

在樹圖雙打的問題是完全一樣的,因爲它是在哈希表雙打 - 平等比較。如果您避免撥打treeMap.get(myDouble),並保留範圍查詢(例如,使用submap),您應該沒問題。

TreeMap<Double,String> tm = new TreeMap<Double,String>(); 
tm.put(1.203, "quick"); 
tm.put(1.231, "brown"); 
tm.put(1.233, "fox"); 
tm.put(1.213, "jumps"); 
tm.put(1.243, "over"); 
tm.put(1.2301, "the"); 
tm.put(1.2203, "lazy"); 
tm.put(1.2003, "dog"); 
for (Map.Entry<Double,String> e : tm.subMap(1.230, 1.232).entrySet()) { 
    System.out.println(e); 
} 

這將打印

1.2301=the 
1.231=brown 

查看ideone這個片段。

0

如果您只是希望它們排序,那麼會有更好的集合(例如SortedSet)。你也可以使用任何列表並使用公用事業進行排序(我認爲他們在java.util.Collection)。

僅當您想通過密鑰直接訪問項目時才使用地圖和表格。

1

如果你只是想對它們進行排序,最好的事情是創建一個圍繞雙和對象的包裝對象,實現對這個包裝的「可比」的界面,並使用一個簡單的收集整理他們

相關問題