首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按对象属性Id索引的SortedSet

按对象属性Id索引的SortedSet
EN

Stack Overflow用户
提问于 2021-02-15 19:25:51
回答 2查看 76关注 0票数 0

想象一下这样简单的课程。

代码语言:javascript
复制
class Observation 
{
   String id;
   Double value;
   Integer quantity;

   //getters only


}

我想收集一些分类的观察结果。

代码语言:javascript
复制
SortedSet<Observations> sortedSet = new TreeSet<Observation>(
            Comparator.comparing(Observation::getValue)
                .thenComparing(Observation::getQuantity));

然后,我收到消息,观察与某些id有价值改变。思想是删除旧的观察,增加新的和更新的价值。

我想出了几种解决方案:

  1. 使用Map来创建存储在SortedSet

中的id和对象实例之间的映射。

代码语言:javascript
复制
    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))

  1. Add等于和hashCode方法用于仅基于Observation.id的观察;然而,我觉得这不是一个优雅的解决方案。
EN

回答 2

Stack Overflow用户

发布于 2021-02-15 19:55:49

我最喜欢的选择是你的解决方案二。rational是您不需要维护update两个集合,并且根据观察id比较覆盖#等于就足够了。

编码愉快。

票数 0
EN

Stack Overflow用户

发布于 2021-02-15 19:58:18

您有一个Observation实例的集合,这些实例按valuequantity排序,但显然不按id排序。

首先,应该将Observation.id添加到要传递到TreeSet的比较器中。这是因为只要有不同的ID,两个Observation实例具有相同的valuequantity是可以的。

您提到,您收到一条消息,即具有某些ID的Observation已更改。现在,具有该ID的Observation必须根据其新的valuequantity移动到新的位置。但是,没有有效的方法可以在Observation中找到具有特定ID的SortedSet

您可以做的一件事就是遍历SortedSet,直到找到要更新的ID的Observation为止。然后你可以移除它并重新添加它。这具有简单性的优点,但是搜索SortedSet的操作将是O(N),这可能不是您想要的。

如果您想要更有效地更新SortedSet,可以将ID的HashMap维护到Observation实例。当您收到Observation被修改的通知时,通过它的ID在HashMap中查找它(我们假设HashMap中的实例未被修改,并且您接收的是具有相同ID但不同值的不同Observation实例),从SortedSet中删除它,更新/替换HashMap中的实例,并将新的/更新的实例添加到SortedSet中。

(通过@Holger的输入更新,谢谢!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66214206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档