哪个 Java 集合允许唯一的重复键值对



我正在尝试编写一个程序来删除单词列表的重复键值对

但是,应允许添加具有不同值的重复键

哪个 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"将被简单地替换。

因此,值的重复性由哈希映射自动处理。

因此,您可以在您的情况下使用哈希图。

最新更新