我正在寻找一个java集合,可能在标准库中,它能够收集以下结构:
class Item {
String key;
double score;
}
并具有以下特性:
只允许一个具有相同密钥的项(如一个集合)
在max o(logn)中插入、删除、检查存在
按分数排序的遍历,在max o(logn)中查找下一个
据我所知,标准orderedset必须具有与equals()接口一致的可比较接口,但这不是我的情况,因为具有不同键的两个项可能具有相同的分数。
事实上,我注意到treeset使用返回0的比较器来检查项目是否已经存在。
有什么建议吗?
5条答案
按热度按时间qlckcl4x1#
感谢那些让我思考他们的评论和回答的人。我相信我们可以通过使用:
只是因为(我没有说过)两个相等的键产生相同的分数;但一般来说,有两个集合Map就足够了:一个(有序的)以有序字段作为键,另一个(不有序的)以唯一字段作为键。
hujrc8aj2#
我认为不存在这样的结构。您没有指定遍历性能要求,因此可以使用一个普通集,将值添加到列表中,并按遍历的分数对该列表进行排序。
cfh9epnr3#
哈希集不保证其元素的任何顺序。如果需要这种保证,可以考虑使用树集来保存元素,但要实现unique by键并保持恒定的时间覆盖
hashCode()
以及equals()
有效地满足您的以下需求:输出:
bttbmeg04#
现在insert已经放宽到o(logn),您可以使用一个双集来完成这项工作,即实现您自己的集,在幕后维护2个集。
最好是你能修改类
Item
实施equals()
以及hashCode()
只使用key
现场。在这种情况下,你的班级将使用HashSet
和一个TreeSet
. 如果hashCode()
涵盖的不仅仅是key
字段,然后使用两个TreeSet
物体。xurqigkl5#
只允许一个具有相同密钥的项(如一个集合)
你的
Item
类应该只使用key
属性。在固定时间内插入、移除、检查是否存在
TreeSet
add()和remove()是o(ln n),因此它们不符合您的条件。HashSet
add()和remove()通常是o(1)。按分数排序的遍历
你的表现要求是什么?您将多久遍历一次集合?如果您主要是添加和删除项目,很少遍历它,那么您可以制作
HashSet
到TreeSet
在遍历操作期间。