有没有一种有效的方法来检查HashMap是否包含映射到相同值的键?

时间:2017-01-08 02:05:36

标签: java hashmap

我基本上需要知道我的HashMap是否有不同的键映射到相同的值。我想知道除了检查地图中所有其他值的每个键值之外还有其他方法。

更新 只是更多的信息,希望澄清我想要完成的事情。考虑一个字符串“azza”。假设我正在迭代此String并将每个字符存储为键,并且它的相应值是其他一些String。假设我最终得到'a'的最后一次出现,并且该值已经在map中。如果与地图中已有的值对应的键也是'a',这将没有问题。当'a'和'z'都映射到相同的值时,我的问题出现了。仅当不同的键映射到相同的值时。

5 个答案:

答案 0 :(得分:4)

当然,代码和执行速度最快的是:

boolean hasDupeValues = new HashSet<>(map.values()).size() != map.size();

在O(n)时间内执行。

设置不允许重复,因此如果存在重复,则设置将小于值列表。

答案 1 :(得分:1)

您可以创建一个<div class="wrapper"> <header class="header">Header</header> <div class="container"> <article class="main"> <p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p> </article> <aside class="aside aside-1">Aside 1</aside> </div> <footer class="footer">Footer</footer> </div>,将值映射到键列表。这将占用更多空间并且需要(略微)更复杂的代码,但具有更高效率的好处(对于仅循环所有值的方法,分摊O(1)与O(n))。

例如,假设您当前有HashMap,并且您想知道哪些键具有相同的值。您创建了另一个地图HashMap<Key, Value> map1

然后,您只需同时修改HashMap<Value, List<Key>> map2map1

map2

然后,要获取映射到map1.put(key, value); if(!map2.containsKey(value)) { map2.put(value, new ArrayList<Key>); } map2.get(value).add(key); 的所有密钥,您只需执行value

如果您需要在许多不同的地方放置/删除,为了确保您不要忘记使用map2.get(value),您可以创建自己的数据结构(即一个单独的类),其中包含2个地图并实现put / remove / get / etc.为此。

编辑:我可能误解了这个问题。如果您不需要实际的密钥列表,只需简单的&#34;是/否&#34;回答&#34;地图是否已包含此值?&#34;,并且您想要比O(n)更好的东西,您可以保留一个单独的map2,它只是计算值出现的次数在地图上。这比列表地图占用的空间要小得多。

答案 2 :(得分:1)

非常类似于上面的EJP和波希米亚的回答,但有流:

boolean hasDupeValues = map.values().stream().distinct().count() != map.size();

答案 3 :(得分:1)

您可以通过调用map.values().contains(value)来检查地图是否已包含值。这不如在地图中查找键有效,但仍然是O(n),并且您不需要创建新的集合以便计算其元素。

但是,您似乎需要的是BiMap。 Java标准库中没有这样的东西,但你可以通过使用两个HashMap来相对容易地构建一个:一个将键映射到值,一个映射值到键。每次将键映射到值时,都可以检查已摊销的O(1)是否已映射到该值,如果不是,则将键映射到一个映射中的值和值在另一个的关键。

如果是为项目创建新依赖项的选项,则某些第三方库包含现成的bimaps,例如Guava(BiMap)和Apache Commons(BidiMap)。< / p>

答案 4 :(得分:0)

您可以迭代键并将当前值保存在Set中。 但是,在将该值插入Set之前,请检查Set是否已包含该值。

如果这是真的,则意味着前一个键已经包含相同的值。

Map<Integer, String> map = new HashMap<>();
Set<String> values = new HashSet<>();
Set<Integter> keysWithSameValue = new HashSet<>();

for(Integer key : map.keySet()) {
  if(values.contains(map.get(key))) {
    keysWithSameValue.add(key);
  }
  values.add(map.get(key));
}