我在Java中有一个哈希图,用于重新获取软件系统的API。所以,我有这样的事情:
[SoftwareID,SoftwareAPI]
当我索要用于软件系统的所有API时,我收到:
[[SoftwareID,SoftwareAPI],[SoftwareID,SoftwareAPI],[SoftwareID,SoftwareAPI]]
但是我有一个问题,我需要删除每个软件的所有重复软件API。
例如,当我遍历哈希图时,
[ [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;
}
最佳答案
从java的Set method add documentation:
如果集合中不包含任何元素e2,则将指定的元素e添加到该集合中,使得(e == null?e2 == null:e.equals(e2))
当您将元素添加到集合中时,可能不认为它们相等。
您可能需要检查API对象的hashCode和equals方法,并覆盖它们。
在TDD中很容易做到这一点。
在使用HashSet时使用hashCode(这是您的情况)。
另请参阅this question about hashSet and equals methods