Java是否具有类似于C ++ STL的多集数据结构?

时间:2012-09-24 13:01:34

标签: java data-structures

我需要一个像STL multiset一样工作的数据结构,但Java中的TreeSet不允许重复元素。 Java中是否有内置的数据结构,相当于multiset?

7 个答案:

答案 0 :(得分:21)

使用Map<E, Integer>其中Integer是计数是Multiset的一个很好的替代品,它也不需要任何第三方库。

更新:如果您确实要将对象存储两次,请使用带有Map<E, List<E>>等地图的列表。

答案 1 :(得分:9)

标准Java库中没有Multiset。您应该使用包含Multiset类的Google Guava框架。 See

答案 2 :(得分:4)

Algorithms 4th edition有一个Bag实现,可以在本书的网站上找到。您也可以在线查看javadoc

  

Bag类表示通用物品的行李(或多行)。它支持以任意顺序插入和迭代项目。

如果你需要Bag,你可能只想查看源代码,但algs4.jar中还有很多其他有趣的东西,所以值得一看。

答案 3 :(得分:2)

Apache Commons CollectionsBagSortedBag个接口。听起来TreeBag可能满足您的需求,但有很多实现可供选择。

答案 4 :(得分:0)

TreeSet<Integer> set = new TreeSet<>();
TreeSet<Integer> multiset = new TreeSet<>((i, j) -> i < j ? 1 : -1);

只需制作1!= 1!

即可创建一个多重集

答案 5 :(得分:0)

您可以使用PriorityQueue元素以自然顺序排序,或者如果您提供,则由比较器排序,并且允许重复。

答案 6 :(得分:0)

从 1.8 开始,Map 允许你这样做:

  map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);

每个值都被添加到一个集合中,该集合是按需创建的。

您可能也需要更改 remove()。