哪个 java 集合允许重复键

Which java collection allows duplicate keys

我正在尝试编写程序来删除单词列表的重复键值对。但是,如果键与不同的值重复,则应允许添加该记录。请帮助我了解哪个 java 集合可以解决这种情况。

你不能通过 Java 集合来完成。

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

最适合您的解决方案是使用 Multimap 并检查值是否已经存在,然后不要添加它。

据我所知,默认的 JRE 中没有这样的集合实现。但是,third party libraries.

中似乎有实现

要获得类似的结果,您可以使用 Map<K, List<V>>,它是一个映射,其中包含每个键的值列表。

但是,我认为您不需要这个。要合并重复键的值,您可以在将新的键值对放入映射之前检查该键是否已经存在。

  • 如果它已经存在,用合并的新旧值替换该值
  • 如果尚不存在,则将新的键值对放入映射中即可。

字典包含单词和定义,因此 sheep="wooly mammal" 是一个有效的赋值。 每次查找绵羊时,您都会找到毛茸茸的哺乳动物。

数组由整数索引,可以有重复值,

    arr[2]=5 ; arr[7]=5;

散列也可以存储重复值,但键必须是唯一的:

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

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

Adam.age=21;

您可以使用多图来完成此操作,使用集合作为值的集合,制作起来相当简单。

这是实现的一些基础知识,不是全部,但无法想象您需要的不止这些,或者可能需要一个删除方法

编辑

刚刚看到你想要丢弃重复的对,可以使用集合来做到这一点,而不是抛出错误只是返回 bool 以显示它是否已经存在(如果它存在 returns假)

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);
    }

}

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

只需将键作为键,值作为 HashMap 中的值。

这是因为键在任何方面都是唯一的,以防值发生冲突 HashMap 维护一个链表来存储所有这些冲突 values.In 任何值都与链表中任何较早的值相同的情况它只是用新的替换旧的。

例如

根据您的要求:

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

所以基本上 hashmap 将存储 "aaaa" 和 "bbbb" 值与 "key1" 作为键。 稍后,当我们尝试针对 "key1" 再次存储 "aaaa" 时,较旧的存储值 "aaaa" 将被简单地替换。

因此,值的重复由 hashmap 自动处理。

因此,您可以根据自己的情况使用 HashMap。

自 Guava 2.0 以来,有一种新的地图类型,即 SetMultimap,您可以使用我认为完全符合您的目的的地图类型。它允许重复键,但不允许重复 key/value 对。见 Guava documentation.