34

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

4

7 回答 7

37

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

更新:如果您真的想将对象存储两次,请使用带有 Map 之类的 List Map<E, List<E>>

于 2013-12-01T13:43:33.690 回答
19

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

于 2012-09-24T13:09:15.620 回答
8

算法第 4 版有一个Bag实现,可在本书的网站上找到。您也可以在线查看javadoc

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

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

于 2012-10-02T22:47:36.863 回答
2

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

于 2012-09-24T13:12:58.050 回答
1

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

于 2018-10-13T02:44:53.223 回答
0

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

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

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

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

于 2020-12-18T18:49:49.593 回答
-1
TreeSet<Integer> set = new TreeSet<>();
TreeSet<Integer> multiset = new TreeSet<>((i, j) -> i < j ? 1 : -1);

只需制作 1 != 1!

于 2018-01-17T18:15:23.713 回答