如何在哈希映射中删除重复的键值对?- 不仅仅是重复的键或值。

3

我在Java中使用哈希映射来检索软件系统的API。因此,我有类似以下的内容:

[SoftwareID, SoftwareAPI] 

当我请求软件系统的所有API时,我会得到以下内容:
[ [SoftwareID, SoftwareAPI], [SoftwareID, SoftwareAPI], [SoftwareID, SoftwareAPI] ]

我有一个问题,我需要根据软件来删除所有重复的SoftwareAPIs。

例如,当我遍历我的哈希映射时,我得到:

[ [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
如果可能的话,你应该使用Guava的Multimap,它可以完全实现你想要达到的目标。在使用Multimap时,仍然需要注意实现equals方法的建议。 - wonderb0lt
2个回答

3

来自Java的 Set方法添加文档:

如果集合不包含任何元素e2(e==null ? e2==null : e.equals(e2)),则将指定元素e添加到此集合中。

当您向集合中添加元素时,它们可能不被视为相等。

您可能需要检查API对象的hashCode和equals方法,并覆盖它们。

在TDD中很容易完成这个过程。

当使用HashSet(就像你的情况一样)时,会使用hashCode。

还可以参考关于hashSet和equals方法的问题


1
你的类API应该实现Comparable接口,这样你的Set才能检查两个API是否相等。

1
"Comparable" 不是缺少的,而是应该实现 "equals" 和 "hashCode"。 - wonderb0lt
谢谢大家。我漏写了等于号。 - Luisa Hernández

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接