哪个java集合允许重复键

时间:2016-02-26 01:24:35

标签: java dictionary collections set duplicates

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

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

6 个答案:

答案 0 :(得分:3)

您可以使用multimap执行此操作,使用set作为值的集合,这非常简单。

以下是一些实现的基础知识,而不是整个事情,但无法想象您需要的不仅仅是或者可能需要删除方法

修改

刚刚看到你想要丢弃重复对,可以使用一组来做,而不是抛出错误只是给了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);
    }

}

答案 1 :(得分:2)

你无法通过Java集合来实现它。

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

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

答案 2 :(得分:1)

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

要获得类似的内容,您可以使用Map<K, List<V>>,这是一个包含每个键值列表的地图。

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

  • 如果已存在,请使用合并的旧值和新值替换值
  • 如果它尚不存在,只需将新的键值对放入地图中。

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

字典包含单词和定义,因此sheep =“wooly mammal”是一个有效的作业。 每次你抬头看羊都会变成毛茸茸的哺乳动物。

数组由整数索引,并且可以具有重复值

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

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

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

有些语言使用点作为属性:

Adam.age=21;

答案 5 :(得分:-2)

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

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

这是因为key将以任何方式唯一,并且如果值中存在冲突,HashMap会维护一个链接列表,用于存储所有这些冲突值。如果任何值与链接列表中的任何早期值相同,则只需替换新的一个。

对于前。

根据您的要求:

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

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

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

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