首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要一个按值排序的哈希图,其中值是状态不断变化的值

我需要一个按值排序的哈希图,其中值是状态不断变化的值
EN

Stack Overflow用户
提问于 2011-11-08 18:49:50
回答 3查看 429关注 0票数 0

我需要一个哈希图解决方案,其中关键是唯一的投资者对象,价值是一个投资组合对象。

问题是,我需要投资者按照他们的投资组合对象进行排序,投资组合对象里面有一个总价值,随着他/她买卖股票而不断变化。

如何解决这个问题?谢谢!

EN

回答 3

Stack Overflow用户

发布于 2011-11-08 19:49:48

根据您的需求,我认为最好的解决方案是将值存储在标准Map中,但提供一种方法来获得order ImmutableSortedSet<Portfolio> getSortedPortfolios()中的投资组合。该方法将获取值列表并将其放入Set中。这假设Portfolios implements Comparable,否则您将需要提供一个Comparator

代码语言:javascript
复制
ImmutableSortedSet<Portfolio> getSortedPortfolios(){
   return ImmutableSortedSet.builder()
             .addAll(myMap.getValues())
             .build();
}

如果你真的需要线程安全,我建议你使用拷贝构造函数来创建快照并插入它们。这将确保返回的排序列表保持排序。

代码语言:javascript
复制
ImmutableSortedSet<Portfolio> getSortedPortfolios(){
   ImmutableSortedSet.Builder<Portfolio> builder = ImmutableSortedSet.builder();

   for (Portfolio p : myMap.getValues()){
      builder.add(new Portfolio(p));
   }

   return builder.build();
}

我在这里使用的是Guava的ImmutableSortedSet,但您可以只使用SortedSet并将其视为不可变的,或者使用Collection.unmodifiable...

票数 1
EN

Stack Overflow用户

发布于 2011-11-08 20:19:34

问题是,我需要投资者按照他们的投资组合对象进行排序,投资组合对象里面有总价值,当他/她买卖股票时,总价值是不变的。

“不断变化”是这里的棘手之处。

AFAIK不是一种高效的(即O(logN)或更好的性能)数据结构,它不能将一些东西排序在一个不断变化的值上。我遇到的所有通用映射API都假定当映射是映射的成员时,键不会改变。

因此,我认为您必须使用事件机制来跟踪Portfolio对象的“值更改”事件。事件处理程序需要从有序映射中自动删除Portfolio,进行更改,然后将其重新添加到新位置。

要实现数据结构,您需要一对映射或一个双向映射。

票数 1
EN

Stack Overflow用户

发布于 2011-11-08 18:55:21

据我所知,Java集合库没有适合您要求的数据结构。但是您可以在common collection library中使用TreeBidiMap

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

https://stackoverflow.com/questions/8049230

复制
相关文章

相似问题

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