2014-06-25 39 views
1

我有一個匹配字符串的HashMap和一個double,我嘗試使用TreeMap對值進行一些修改後對它進行排序。TreeMap strangley working

它的工作原理和我可以打印整個樹,但是當我嘗試通過它的鍵訪問特定值時,它大約一半的時間返回null,總是在相同的鍵上,即使它們的值沒有那麼不同從其他人那裏。 同樣,重試刪除密鑰不起作用。

這是我的問題的一個例子。這是不是真的我的代碼的一部分,但它再現了同樣的問題:

Map<String, Double> freq = new HashMap<String, Double>(); 
    ValueComparator classif = new ValueComparator(freq); 
    TreeMap<String, Double> sorted_freq = new TreeMap<String, Double>(classif); 

    freq.put("bara" , 0.1142204454597373); 
    freq.put("religieux" , 0.05711022272986865); 
    freq.put("alliance" , 0.05711022272986865); 
    freq.put("ethnique" , 0.05711022272986865); 
    freq.put("officiers" , 0.1142204454597373); 
    freq.put("ascendants" , 0.05711022272986865); 
    freq.put("correspondait" , 0.05711022272986865); 
    freq.put("toko" , 0.05711022272986865); 
    freq.put("evenement" , 0.1142204454597373); 
    freq.put("certainement" , 0.05711022272986865); 
    freq.put("chance" , 0.05711022272986865); 

    sorted_freq.putAll(freq); 
    for(String key:freq.keySet()){ 
     System.out.println(key+" : "+freq.get(key)); 
    } 
    System.out.println("------------------------------------------------------------------"); 
    for(String key:sorted_freq.keySet()){ 
     System.out.println(key+" : "+sorted_freq.get(key)); 
    } 

這裏是我使用建樹形圖中比較:

class ValueComparator implements Comparator<String> { 

    Map<String, Double> base; 
    public ValueComparator(Map<String, Double> freq) { 
     this.base = freq; 
    } 

    public int compare(String a, String b) { 
     if (base.get(a) > base.get(b)) { 
      return -1; 
     }else if(base.get(a)==base.get(b)){ 
      return 0; 
     } else { 
      return 1; 
     } 
    } 
} 

如果您有任何insigth那請賜教。

+0

什麼樣的修改?如果該比較器變得不一致或不完整,則TreeMap將停止工作。 – Thilo

+0

我嘗試了等號方法,大約一半的條目消失了......修改只是將整數值除。我在示例中使用的值是修改 – Laetan

回答

1

你的問題是,如果你的原始地圖的兩個條目具有相同的值,則只有最後插入freq將保持不變。因此,從樹形圖中刪除已在freq中替換的密鑰。

實施例:

freq.put("bara" , 0.1142204454597373); 
freq.put("religieux" , 0.05711022272986865); 
freq.put("alliance" , 0.05711022272986865); 

然後freq.get("religieux")返回null因爲,因爲它具有相同的值和"alliance""alliance"已經插入之後,"religieux"已取代"alliance"因爲它們被認爲是由比較器相等。

此外,在其他的答案建議,你需要比較Double值做base.get(a).equals(base.get(b))

+0

+1爲了解決這個問題,你可以比較的關鍵,以及如果值是相等的(改變'返回0'到'返回a.compareTo(b)') – Thilo

+0

非常感謝,你的解決方案似乎糾正了我的問題。我不知道使用比較器類的任何事情,所以它確實有幫助 – Laetan

+0

這可能無法解決比較方法的核心問題。而不是使用==你應該在比較方法中使用equals。 – vinayknl

1
if(base.get(a)==base.get(b)) 

這比較了Double-objects而不是值的實例。嘗試將其更改爲

if(base.get(a).doubleValue()==base.get(b).doubleValue()) 
+0

+1的結果。得到愛自動裝箱... – Thilo

0

如下更改比較方法。

public int compare(String a, String b) { 
    if (base.get(a) > base.get(b)) { 
     return -1; 
    }else if(base.get(a).equals(base.get(b))){ 
     return 0; 
    } else { 
     return 1; 
    } 
} 

這是你的代碼的主要原因失敗

+0

這似乎使大多數條目消失。 – Laetan

+0

您的比較器實現說只有非重複值。這是條目重複值丟失的原因,因爲當從hashmap向treemap添加條目時,它返回0。 – vinayknl

+0

Alrigth。我剛剛複製了一個比較器的實現。我對這堂課幾乎一無所知。也許我應該更多地瞭解我正在使用的內容:p – Laetan