我需要一个像STL multiset一样工作的数据结构,但Java中的TreeSet不允许重复元素。 Java中是否有内置的数据结构,相当于multiset?
答案 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 Collections有Bag
和SortedBag
个接口。听起来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()。