我有一个嵌套的Hashmap(使用JDK 7),如下所定义
private static HashMap<SourceSystemIdEnum, HashMap<String, HashMap<StatsEnum, Double>>> statsCache = new HashMap<SourceSystemIdEnum, HashMap<String, HashMap<StatsEnum, Double>>>();
所有地图的所有关键字(也嵌套)都是在运行时创建的,外部地图的值是另一个地图;下一级地图的价值是另一张地图;而且最里面的地图的价值只是一个双倍(它不会是收藏)。
我使用上面的数据结构来维护缓存(树状对象层次结构),其中每秒更新最内层映射的值(即Double类型)。
我遇到了http://tomjefferys.blogspot.com/2011/09/multimaps-google-guava.html,同时寻找更好/更简单的嵌套地图。但内心最多的地图的价值永远不会被收集,所以谷歌番石榴看起来似乎并不相关(?)
我也遇到了这个How to iterate through Nested Map and Multiset? - Java/Guava甚至迭代在番石榴中似乎没有任何好处(似乎)。
我正在尝试在迭代或更新我的场景的值(地图中的地图内的地图)时减少常规(肉鸡板)代码,以及如何重写现有代码以切换到Google Guava的多图(或者是比jdk7的常规hashmap更好。
**** **** EDIT 我同意这种深度嵌套是不寻常的。我可以有一个地图列表,但随后查找将是昂贵的。这是地图的细分
HashMap:外部地图将各种数据馈送表示为密钥(例如:NDAQ,CBOE,NYSE,AMEX)
HashMap中级地图代表各种代码作为键(例如:CSCO,INTC,MSFT ..)
HashMap:外部地图表示各种统计参数(EX:mean,median,skew,kurtosis)的值作为键,这是Double值 每分钟都会更新
注意:上面3个地图中的所有键都是事先已知的(因此地图不会在运行时增长或调整大小 - 它只是内部大多数地图中的Double值,每分钟都会更新)
答案 0 :(得分:3)
番石榴Table
可以帮助解决您的问题吗?
最终,如果您需要拥有如此多的间接性,那么这是一个不寻常的问题。您想在此结构中表示哪种数据?您尝试执行哪些操作?
答案 1 :(得分:3)
让我觉得你使用集合类型来代替合适的复杂密钥。
如果我可以归结为你想要完成的事情,那就是根据三件事情查找股票统计数据:卖单,股票代码和统计类型。在我看来,这个HashMap
结构仅用于缓存和查找,并且层次结构不相关。
鉴于此,我们定义一个复杂的密钥:
public final class StockStatisticKey {
private final SourceSystemIdEnum systemId;
private final String tickerName;
private final StatsEnum statType;
public StockStatisticKey(SourceSystemIdEnum systemId, String tickerName, StatsEnum statType) {
this.systemId = systemId;
this.tickerName = tickerName;
this.statType = statType;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof StockStatisticKey) {
StockStatisticKey other = (StockStatisticKey) obj;
boolean equal = true;
equal &= Objects.equal(systemId, other.systemId);
equal &= Objects.equal(tickerName, other.tickerName);
equal &= Objects.equal(statType, other.statType);
return equal;
}
return false;
}
public int hashCode() {
return Objects.hashCode(systemId, tickerName, statType);
}
}
现在您可以拥有一个Cache<StockStatisticKey, Double>
,您可以根据此复杂密钥快速查找您的值。这应该执行每个位以及嵌套的HashMaps,并添加语义值。
您也可以考虑一些变体,其中SourceSystemIdEnum
和代码名称一起形成一个键,StatusEnum
作为第二个键,这些值将进入番石榴{{1} }。
答案 2 :(得分:0)
树似乎是良好的数据结构(如@Ata建议的那样)。因为没有树的标准JDK实现(??)并且不相信添加开源树实现(来自maven),所以我将坚持使用现有的嵌套映射。 如果我找到更好的解决方案,我会更新这个答案