2014-10-07 123 views
0

我有一個HashMap在Java中:Java - 如何從HashMap中刪除重複項?

HashMap<String, Integer> meh = new HashMap<String, Integer>();` 

meh.put("one", 1); 
meh.put("one", 1); 
meh.put("one", 1); 
meh.put("two", 1); 
meh.put("two", 2); 
meh.put("three", 3); 

我需要的是刪除重複項(「一」,1)當兩個鍵和值重複。我搜索並發現只有'如何刪除重複的鍵/值'。誰能幫忙?

+1

它已經完成...您不能有多個項目使用相同的密鑰... – SJuan76 2014-10-07 19:32:42

+1

您確定您可以有重複的密鑰嗎?首先檢查Java文檔... – Alboz 2014-10-07 19:32:56

+1

地圖不會讓您使用同一個鍵多次輸入。就像在現實世界中一樣,點上地圖只能描述一個位置,所以每次使用'put(key,value)'時,都只需要更新現有值。只有我能想到的map用於存儲多個具有相同鍵的條目時,鍵的實例是不正確地重寫了hashcode和equals方法的類型,這對於String類型的鍵是不可能的。 – Pshemo 2014-10-07 19:33:17

回答

2

您無法從HashMap刪除重複項,因爲首先HashMap中沒有重複項。第二個(或第三個或其他)時間用put調用put時已經存在於地圖中,它將簡單地用新值覆蓋該值,而不管它是否與預先存在的值重複。

在你提供的代碼片段中,地圖只有三個值。

3

有沒有必要這樣做,HashMap自動照顧。 -

meh.put("one", 1); 

這本身替換的分配,使地圖{」

meh.put("one", 1); 

這使得地圖{> 1「一」}:當您執行代碼基本上如下會發生什麼一個」 - > 1}

meh.put("one", 1); 

這本身替換分配,使得地圖{ 「一」 - > 1}

meh.put("two", 1); 

這增加了所請求的連接,使得地圖{ 「一」 - > 1 「兩個」 - > 1}

meh.put("two", 2); 

此替換分配爲 「二」,使得地圖{「一個「 - > 1 」兩個「 - > 2}

meh.put("three", 3); 

這增加了新的元件,使得總映射{」 一」 - > 1 「兩個」 - > 2, 「三」 - > 3 }沒有涉及重複。

2

從你所描述的來看,Map<String, Integer>並非適合你的需求的結構:你似乎沒有指定2"two"的值,但實際上你存儲了成對的元素。

更好的數據結構,可能是使用MyPairSet其中MyPair是:

public class MyPair { 
    private String first; 
    private int second; 
    // + constructor, getters + setters, hashcode + equals 
} 

然後你就可以使用該MyPair對象在HashSet

Set<MyPair> myPairs = new HashSet(); 
myPairs.add(new MyPair("one", 1)); 
myPairs.add(new MyPair("one", 2)); 
myPairs.add(new MyPair("two", 2));  
myPairs.add(new MyPair("two", 2)); 
myPairs.remove(new MyPair("one", 2)); // remove MyPair("one", 2) only 
+0

打敗了我四秒鐘,再加上我喜歡你明確的觀察,OP實際上只是存儲元素對。我要離開我的,因爲OP使用hashmap表明可能需要提取由鍵映射到的所有唯一值。 – CPerkins 2014-10-07 19:47:20

1

你真正的問題ISN如何刪除重複項。

這是如何保留重複鍵的唯一值。

查看此答案https://stackoverflow.com/a/8229534/152578作者:Jon Skeet查看詳細資料,但基本上你正在尋找一個multimap。

您必須檢查插入值。

另一種選擇是統一鍵和值(方法取決於你的符號空間),並將它們存儲在一個集合中。