哪个java集合允许复制密钥

哪个java集合允许复制密钥,java,dictionary,collections,set,duplicates,Java,Dictionary,Collections,Set,Duplicates,我正试图编写程序来删除单词列表中重复的键值对。但是,如果密钥以不同的值复制,则应允许添加该记录。请帮助我了解哪种java集合可以解决这种情况 键1 aaaa 键2 bbbb 键3中国交建 键4 dddd 键2 bbbb-重复对-不允许 key1 hhhh-重复密钥-允许 键5-gggg 键2 nnnn 您不能通过Java集合来完成 您可以使用Multimap,它支持重复键,但也支持重复键和值对 最好的解决方案是使用Multimap并检查值是否已经存在,然后不要添加它。据我所知,默认JRE中没有

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

  • 键1 aaaa
  • 键2 bbbb
  • 键3中国交建
  • 键4 dddd
  • 键2 bbbb-重复对-不允许
  • key1 hhhh-重复密钥-允许
  • 键5-gggg
  • 键2 nnnn

您不能通过Java集合来完成

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


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

据我所知,默认JRE中没有此类集合实现。然而,在中似乎有一些实现

要获得类似的结果,可以使用
映射
,该映射包含每个键的值列表

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

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

字典包含单词和定义,因此sheep=“wooly Mamala”是一个有效的赋值。 每次你们看羊,都会看到毛茸茸的哺乳动物

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

    arr[2]=5 ; arr[7]=5;
散列也可以存储重复的值,但键必须是唯一的:

    Adam{age}=21;
    Bill{age}=21;
某些语言使用点作为属性:

Adam.age=21;

您可以使用多重映射来实现这一点,使用集合作为值的集合,这非常简单

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

编辑

刚才看到您希望丢弃重复对,可以使用集合来完成,而不是抛出错误,只是返回bool以显示它是否已经存在(如果存在,则返回false)

公共类多值映射
{
私有最终映射映射=新HashMap();
公共设置getValues(K键)
{
返回映射。get(键);
}
公共布尔值(K键,V值)
{
Set target=mappings.get(键);
if(target==null)
{
target=newhashset();
映射。put(键、目标);
}
返回目标。添加(值);
}
}

您的案例基本上需要一个HashMap

只需将key作为key,value作为value放在HashMap中

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

例如

根据您的要求:

键1 aaaa——应存储 键1 bbbb——应存储 键1 aaaa--不应存储,因为它是重复的

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

因此,值的双重性由hashmap自动处理


因此,您可以在您的案例中使用HashMap。

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

根据定义,键不能重复。您所说的是复合键(由多个值组成)。因此,这意味着您可以使用一个常规映射,只要您使用一个组合了这两个值的键。在您的傲慢中,您忘记了给出否决投票的有效原因。
HashMap
不会在同一个键下存储重复的值-每个键只能有一个条目;如果您添加另一个具有相同密钥的条目,则该条目将被替换。如果要存储给定键的所有条目,则该值必须是您添加到的集合;这使得维护变得更加复杂
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);
    }

}