我需要一个hashmap解决方案,其中key是一个唯一的Investor Object,value是一个Portfolio对象。
问题在于我需要投资者按其投资组合对象进行排序,投资组合对象的内部总价值随着他/她购买/出售股票而不断变化。
如何解决这个问题? 谢谢!
答案 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