想象一下这样简单的课程。
class Observation
{
String id;
Double value;
Integer quantity;
//getters only
}我想收集一些分类的观察结果。
SortedSet<Observations> sortedSet = new TreeSet<Observation>(
Comparator.comparing(Observation::getValue)
.thenComparing(Observation::getQuantity));然后,我收到消息,观察与某些id有价值改变。思想是删除旧的观察,增加新的和更新的价值。
我想出了几种解决方案:
中的id和对象实例之间的映射。
observation = new Observation(id, value, quantity)
map.put(observation.getId(), observation)
sortedSet.add(observation)
//then I can remove observation with given id with
sortedSet.remove(map.get(someId))发布于 2021-02-15 19:55:49
我最喜欢的选择是你的解决方案二。rational是您不需要维护update两个集合,并且根据观察id比较覆盖#等于就足够了。
编码愉快。
发布于 2021-02-15 19:58:18
您有一个Observation实例的集合,这些实例按value和quantity排序,但显然不按id排序。
首先,应该将Observation.id添加到要传递到TreeSet的比较器中。这是因为只要有不同的ID,两个Observation实例具有相同的value和quantity是可以的。
您提到,您收到一条消息,即具有某些ID的Observation已更改。现在,具有该ID的Observation必须根据其新的value和quantity移动到新的位置。但是,没有有效的方法可以在Observation中找到具有特定ID的SortedSet。
您可以做的一件事就是遍历SortedSet,直到找到要更新的ID的Observation为止。然后你可以移除它并重新添加它。这具有简单性的优点,但是搜索SortedSet的操作将是O(N),这可能不是您想要的。
如果您想要更有效地更新SortedSet,可以将ID的HashMap维护到Observation实例。当您收到Observation被修改的通知时,通过它的ID在HashMap中查找它(我们假设HashMap中的实例未被修改,并且您接收的是具有相同ID但不同值的不同Observation实例),从SortedSet中删除它,更新/替换HashMap中的实例,并将新的/更新的实例添加到SortedSet中。
(通过@Holger的输入更新,谢谢!)
https://stackoverflow.com/questions/66214206
复制相似问题