我需要一个哈希图解决方案,其中关键是唯一的投资者对象,价值是一个投资组合对象。
问题是,我需要投资者按照他们的投资组合对象进行排序,投资组合对象里面有一个总价值,随着他/她买卖股票而不断变化。
如何解决这个问题?谢谢!
发布于 2011-11-08 19:49:48
根据您的需求,我认为最好的解决方案是将值存储在标准Map中,但提供一种方法来获得order ImmutableSortedSet<Portfolio> getSortedPortfolios()中的投资组合。该方法将获取值列表并将其放入Set中。这假设Portfolios implements Comparable,否则您将需要提供一个Comparator。
ImmutableSortedSet<Portfolio> getSortedPortfolios(){
return ImmutableSortedSet.builder()
.addAll(myMap.getValues())
.build();
}如果你真的需要线程安全,我建议你使用拷贝构造函数来创建快照并插入它们。这将确保返回的排序列表保持排序。
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...
发布于 2011-11-08 20:19:34
问题是,我需要投资者按照他们的投资组合对象进行排序,投资组合对象里面有总价值,当他/她买卖股票时,总价值是不变的。
“不断变化”是这里的棘手之处。
AFAIK不是一种高效的(即O(logN)或更好的性能)数据结构,它不能将一些东西排序在一个不断变化的值上。我遇到的所有通用映射API都假定当映射是映射的成员时,键不会改变。
因此,我认为您必须使用事件机制来跟踪Portfolio对象的“值更改”事件。事件处理程序需要从有序映射中自动删除Portfolio,进行更改,然后将其重新添加到新位置。
要实现数据结构,您需要一对映射或一个双向映射。
发布于 2011-11-08 18:55:21
据我所知,Java集合库没有适合您要求的数据结构。但是您可以在common collection library中使用TreeBidiMap
https://stackoverflow.com/questions/8049230
复制相似问题