【问题标题】:Which java collection allows duplicate keys哪个java集合允许重复键
【发布时间】:2016-06-09 01:51:28
【问题描述】:

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

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

【问题讨论】:

  • 键在定义上不能重复。您所说的称为复合键(由多个值组成)。因此,这意味着您可以使用常规映射,只要您使用组合两个值的键。

标签: java dictionary collections set duplicates


【解决方案1】:

从 Guava 2.0 开始,有一种新的地图类型,即 SetMultimap,您可以使用它,我认为它完全符合您的目的。它允许重复键,但不允许重复键/值对。请参阅Guava documentation

【讨论】:

    【解决方案2】:

    你的case基本上需要一个HashMap。

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

    这是因为键在任何情况下都是唯一的,并且在值发生冲突的情况下,HashMap 维护一个链表来存储所有这些冲突的值。如果任何值与链表中的任何早期值相同,它只会替换旧的和新的。

    例如。

    根据您的要求:

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

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

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

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

    【讨论】:

    • 在你的傲慢中,你忘记给出反对票的正当理由。
    • HashMap 不会在同一个键下存储重复值 - 每个键只能有一个条目;如果您使用相同的键添加另一个条目,该条目将被替换。如果要存储给定键的所有条目,则该值必须是您添加到的集合;这使得维护变得更加复杂
    【解决方案3】:

    您可以使用多图来做到这一点,使用集合作为值的集合,制作起来相当简单。

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

    编辑

    刚刚看到您希望丢弃重复的对,可以使用集合来做到这一点,而不是抛出错误,只需返回 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);
        }
    
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

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

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

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

      Adam.age=21;
      

      【讨论】:

        【解决方案5】:

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

        要获得类似的结果,您可以使用Map&lt;K, List&lt;V&gt;&gt;,这是一个包含每个键的值列表的映射。

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

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

        【讨论】:

          【解决方案6】:

          你不能通过 Java 集合来做到这一点。

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

          对你来说最好的解决方案是使用 Multimap 并检查值是否已经存在然后不要添加它。

          【讨论】:

            猜你喜欢
            • 2012-09-30
            • 1970-01-01
            • 2013-08-22
            • 2020-05-29
            • 1970-01-01
            • 2020-11-04
            • 2018-08-31
            • 1970-01-01
            • 2012-03-16
            相关资源
            最近更新 更多