哪个Java集合允许唯一的重复键值对?

9

我正在尝试编写一个程序来删除单词列表中的重复键值对。

然而,允许添加具有不同值的重复键。

哪种Java集合可以解决这种情况?

  • key1 aaaa
  • key2 bbbb
  • key3 cccc
  • key4 dddd
  • key2 bbbb - 重复对 - 不允许
  • key1 hhhh - 重复键 - 允许
  • key5 gggg
  • key2 nnnn

按照定义,键不能重复。你所说的是一个复合键(由几个值组成)。这意味着只要使用结合了两个值的键,就可以使用常规映射。 - Dmitry B.
6个回答

9
你可以使用multimap实现此功能,使用set作为其值的集合,这很容易实现。
以下是一些实现的基础知识,不是全部但我认为应该足够了,或许还需要一个删除方法。
编辑
刚刚看到您想要丢弃重复的配对,可以使用set来实现,而不是抛出错误,只需返回bool值以显示它是否已存在(如果它存在则返回false)。
public class MultiValueMap<K,V> 
{
    private final Map<K,Set<V>> mappings = new HashMap<K,Set<V>>();

    public Set<V> getValues(K key)
    {
        return mappings.get(key);
    }

    public Boolean putValue(K key, V value)
    {
        Set<V> target = mappings.get(key);

        if(target == null) 
        {
            target = new HashSet<V>();
            mappings.put(key,target);
        }

        return target.add(value);
    }

}

2

您不能通过Java集合实现此操作。

您可以使用Multimap,它支持重复的键,但也支持重复的键值对。

对于您来说,最好的解决方案是使用Multimap,并检查该值是否已存在,如果存在,则不添加它。


2
据我所知,默认的JRE中没有这样的集合实现。然而,在第三方库中似乎有相应的实现。(点击此处查看) 如果想要类似的功能,您可以使用一个Map<K, List<V>>,它是一个包含每个键对应值列表的映射。
不过,我认为您并不需要这样做。要合并重复键的值,您可以在将新的键值对放入映射之前检查该键是否已经存在。
  • 如果已经存在,则用旧值和新值合并后替换该值。
  • 如果不存在,则只需将新的键值对放入映射中。

1
自Guava 2.0以来,有一种新的映射类型,即SetMultimap,我认为它完全符合您的目的。它允许重复的键,但不允许重复的键/值对。请参见Guava文档

-1
一个字典包含单词和定义,所以 sheep="有毛的哺乳动物" 是有效的赋值。每次查找 sheep 时,都会得到“有毛的哺乳动物”。
数组由整数索引,并且可以具有重复值。
    arr[2]=5 ; arr[7]=5;

哈希表也可以存储重复的值,但键必须是唯一的:

    Adam{age}=21;
    Bill{age}=21;

一些编程语言使用点来表示属性:

Adam.age=21;

-2

你的情况基本上需要一个HashMap。

只需在HashMap中将键作为键,值作为值即可。

这是因为键​​总是唯一的,如果值发生冲突,则HashMap维护链表以存储所有这些冲突值。如果任何值与链接列表中的任何早期值相同,则它将简单地用新值替换旧值。

例如:

根据您的要求:

Key1 aaaa--应该被存储 Key1 bbbb--应该被存储 Key1 aaaa--不应存储,因为它是重复的。

因此,哈希映射将针对“key1”存储“aaaa”和“bbbb”值。

后来,当我们再次尝试将“aaaa”存储在“key1”中时,先前存储的值“aaaa”将被简单地替换。

因此,哈希映射自动处理值的重复性。

因此,在你的情况下,你可以使用HashMap。


在你的傲慢中,你忘记了给出一个有效的理由来解释你的负评。 - rootExplorr
2
HashMap 不会在同一个键下存储重复的值 - 每个键只能有一个条目;如果您添加具有相同键的另一个条目,则该条目将被替换。如果要存储给定键的所有条目,则值必须是一个集合,您需要将其添加到其中;这使得维护变得更加复杂。 - simonalexander2005

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