哪个java集合允许复制密钥
我正试图编写程序来删除单词列表中重复的键值对。但是,如果密钥以不同的值复制,则应允许添加该记录。请帮助我了解哪种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中没有
- 键1 aaaa
- 键2 bbbb
- 键3中国交建
- 键4 dddd
- 键2 bbbb-重复对-不允许
- key1 hhhh-重复密钥-允许
- 键5-gggg
- 键2 nnnn
最好的解决方案是使用Multimap并检查值是否已经存在,然后不要添加它。据我所知,默认JRE中没有此类集合实现。然而,在中似乎有一些实现 要获得类似的结果,可以使用
映射
,该映射包含每个键的值列表
然而,我认为你不需要这个。要合并重复键的值,可以在将新的键值对放入映射之前检查该键是否已存在
- 如果该值已存在,则用合并的新旧值替换该值
- 如果它还不存在,只需将新的键值对放入映射中
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);
}
}