需要按值排序的hashmap,其中value is state不断变化

时间:2011-11-08 10:49:50

标签: java hashmap

我需要一个hashmap解决方案,其中key是一个唯一的Investor Object,value是一个Portfolio对象。

问题在于我需要投资者按其投资组合对象进行排序,投资组合对象的内部总价值随着他/她购买/出售股票而不断变化。

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

3 个答案:

答案 0 :(得分:1)

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

ImmutableSortedSet<Portfolio> getSortedPortfolios(){
   return ImmutableSortedSet.builder()
             .addAll(myMap.getValues())
             .build();
}

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

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 :(得分:1)

  

问题在于我需要投资者按照他们的投资组合对象进行排序,投资组合对象的内部总价值,不断购买/卖出股票。

“不断变化”是这里棘手的部分。

AFAIK,没有效率(即O(logN)或更好的性能)数据结构,可以保持某些事物按不断变化的值排序。我所遇到的所有通用映射API都假设当映射是映射的成员时键不会改变。

所以,我认为你必须使用事件机制来跟踪Portfolio对象的“值的变化”事件。事件处理程序需要从有序映射中自动删除Portfolio,进行更改,然后在新位置再次将其添加回来。

要实现数据结构,您需要一对地图或双向地图。

答案 2 :(得分:0)

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

中使用TreeBidiMap