我正在尝试编写一个程序来删除单词列表的重复键值对。
但是,应允许添加具有不同值的重复键。
哪个 Java 集合可以解决这种情况?
- 键1 AAAA
- 键2 BBBB
- Key3 中交
- key4 dddd
- key2 bbbb - 重复对 - 不允许
- key1 hhhh - 重复键 - 允许
- 键5 gggg
- Key2 nnnn
您可以使用多映射来执行此操作,使用集合作为值的集合,制作起来相当简单。
这是实现的一些基础知识,而不是全部,但无法想象您需要更多或删除方法
编辑
刚刚看到您希望丢弃重复的对,可以使用集合来做到这一点,而不是抛出错误只是返回布尔值以显示它是否已经存在(如果存在返回 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);
}
}
你不能通过 Java 集合来做到这一点。
您可以使用 Multimap 它支持重复键,但也支持重复键和值对。
最适合您的解决方案是使用Multimap并检查值是否已存在,然后不要添加它。
据我所知,默认 JRE 中没有这样的集合实现。但是,第三方库中似乎有实现。
要获得类似的东西,您可以使用 Map<K, List<V>>
,这是一个包含每个键的值列表的映射。
但是,我认为您不需要这个。要合并重复键的值,您可以在将新的键值对放入映射之前检查键是否已存在。
- 如果已存在,请将该值替换为合并的旧值和新值
- 如果尚不存在,只需将新的键值对放入映射中即可。
从 Guava 2.0 开始,有一种新的地图类型,SetMultimap,你可以使用它,我认为它完全符合你的目的。它允许重复键,但不允许重复键/值对。请参阅番石榴文档。
包含单词和定义,因此sheep="毛茸茸的哺乳动物"是一个有效的赋值。每次你抬头看绵羊,你都会得到毛茸茸的哺乳动物。
数组由整数索引,并且可以具有重复值,
arr[2]=5 ; arr[7]=5;
哈希也可以存储重复值,但键必须是唯一的:
Adam{age}=21;
Bill{age}=21;
某些语言对属性使用点:
Adam.age=21;
你的情况基本上需要一个HashMap。
只需将键作为键,将值作为值放入HashMap中即可。
这是因为键在任何方式上都是唯一的,如果值发生冲突,HashMap 会维护一个链表来存储所有这些冲突值。如果任何值与链表中任何较早的值相同,则只需用新值替换旧值。
例如。
根据您的要求:
密钥1 aaaa -- 应存储Key1 bbbb -- 应该存储Key1 aaaa -- 不应存储,因为它是重复的。
所以基本上hashmap将存储"aaaa"和"bbbb"值,反对"key1"作为键。稍后,当我们尝试针对"key1"再次存储"aaaa"时,旧的存储值"aaaa"将被简单地替换。
因此,值的重复性由哈希映射自动处理。
因此,您可以在您的情况下使用哈希图。