2015-04-29 35 views
3

我有一個Java的hashmap用於軟件系統的retreaving APIs。所以,我有這樣的事情:如何在Hashmap中刪除重複的Key-Value對? - 不只是重複密鑰或值

[SoftwareID,SoftwareAPI]

當我詢問軟件系統所有的API,我得到:

[SoftwareID,SoftwareAPI] ,[SoftwareID,SoftwareAPI],[SoftwareID,SoftwareAPI]]

但我有一個問題,我需要刪除所有重複SoftwareAPI每個軟件。

例如,當我重複了我的HashMap中我得到的,

[ [0, A], [0, B], [0, A], [0, A] ]; 

[ [1, A], [1, B], [1, B], [1, C] ]; 

[ [2, A], [2, B], [2, A] ]; 

,但我需要刪除重複的對,所以這將是這樣的:

[ [0, A], [0, B] ]; 

[ [1, A], [1, B], [1, C] ]; 

[ [2, A], [2, B] ] 

只是添加一些代碼這裏的信息是代碼的一部分:

// HashMap APIs per user/Systems 
HashMap<Integer, Set<API>> apisPerSystem = new HashMap<Integer, Set<API>>(); 

/** 
* Stores a API in the data model 
* @param system the user 
* @param api the item 
* @return the newly added API 
*/ 
public API addAPIs(int system, String api) { 
    API r = new API(system,api); 
    apis.add(r); 
    Set<API> systemApis = apisPerUser.get(system); 
    if (systemApis == null) { 
     systemApis = new HashSet<API>(); 
    } 
    apisPerUser.put(system, systemApis); 
    systemApis.add(r); 
    systems.add(system); 
    apisList.add(api); 
    return r; 
} 

// Get the APIs per Systemfrom the outside. 
public HashMap<Integer, Set<API>> getAPIsPerSystem() { 
    return apisPerSystem; 
} 
+1

如果可能的話,你應該使用番石榴的[Multimap之(http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html )這正是你想要實現的。關於實現的建議仍然使用Multimap。 – wonderb0lt

回答

3

從Java的Set method add documentation

添加指定的元素e這套如果集合不包含構件e2,使得(E == NULL E2 == NULL:e.equals(E2))

當您將元素添加到設置中時,它們可能不會被視爲相等。

您可能需要檢查API對象的hashCode和equals方法,並覆蓋它們。

這在TDD中很容易完成。

當使用HashSet(這是你的情況)時使用hashCode。

另見this question about hashSet and equals methods

+0

非常感謝。有效。 –

1

你的類API應該實現Interface Comparable你的設置將能夠檢查2 API是否等於或不是。

+1

「Comparable」不是缺少的,而應該實現'equals'和'hashCode'。 – wonderb0lt

+0

謝謝大家。我失去了平等。 –