如何轻松访问java(或谷歌番石榴)中的嵌套地图

时间:2014-05-08 23:19:18

标签: java collections guava apache-commons

我有一个嵌套的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值,每分钟都会更新)

3 个答案:

答案 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),所以我将坚持使用现有的嵌套映射。 如果我找到更好的解决方案,我会更新这个答案