如何轻松访问java(或google guava)中的嵌套地图

如何轻松访问java(或google guava)中的嵌套地图,java,collections,guava,apache-commons,Java,Collections,Guava,Apache Commons,我有一个嵌套的Hashmap(使用jdk7),定义如下 private static HashMap<SourceSystemIdEnum, HashMap<String, HashMap<StatsEnum, Double>>> statsCache = new HashMap<SourceSystemIdEnum, HashMap<String, HashMap<StatsEnum, Double>>>(); priv

我有一个嵌套的Hashmap(使用jdk7),定义如下

private static HashMap<SourceSystemIdEnum, HashMap<String, HashMap<StatsEnum, Double>>> statsCache = new HashMap<SourceSystemIdEnum, HashMap<String, HashMap<StatsEnum, Double>>>();
private static HashMap statcache=new HashMap();
所有映射(嵌套)的所有键都是在运行时创建的,外部映射的值是另一个映射;下一级地图的值是另一个地图;最里面的贴图的值只是一个双精度值(它不是集合)

我使用上述数据结构来维护缓存(树状对象层次结构),其中最内部映射的值每秒更新一次(即双类型)

我是在寻找更好/更容易的嵌套地图时遇到的。但最内层地图的价值永远不会是收藏,所以谷歌番石榴乍一看似乎并不相关(?)

我也遇到过这种情况,甚至在番石榴中也没有更好的效果(看起来)

我试图在迭代或更新我的场景(map内map内map内map)的值时减少例程(Bounder plate)代码,以及如何重写现有代码以切换到Google Guava的multimap(或者这将比jdk7的常规hashmap更好)

****编辑**** 我同意有这么深的巢是不寻常的。我可以有一个地图列表,但这样的话,查找将是昂贵的。这是地图的细目

HashMap:外部映射将各种数据源表示为键(例如:NDAQ、CBOE、NYSE、AMEX)

HashMap中级地图将各种股票代码表示为键(例如:CSCO、INTC、MSFT..)

HashMap:外部映射表示各种统计参数的值(例如:平均值、中值、偏斜、峰度)作为关键点,它是这些双值 每分钟更新一次

注意:以上3张地图中的所有关键点都是预先知道的(因此,地图在运行时不会增长或调整大小。在最内部的地图中,每分钟更新一次的值只有两倍)

番石榴可以帮助解决您的问题吗

归根结底,在需要这么多间接操作的情况下出现问题是不寻常的。您试图在此结构中表示什么样的数据?你想做什么手术?

番石榴能帮你解决问题吗


归根结底,在需要这么多间接操作的情况下出现问题是不寻常的。您试图在此结构中表示什么样的数据?您试图执行什么类型的操作?

我突然想到,您正在使用集合类型来替代适当的复杂键

如果我能概括一下你想要完成的事情,那就是根据三件事来查找股票统计数据:feed、ticker和statistic type。在我看来,这个
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);
    }
}
现在,您可以拥有一个
缓存
,在那里您可以基于这个复杂的键快速查找您的值。这应该像嵌套的HashMaps一样执行每一位,并为其添加语义值


你也可以考虑一些变体,其中<代码> SourceSystemIdEnum < /C>和TIKER名称一起构成一个键,<代码> StaseNeNUM/COD>作为第二个键,这些值将进入一个Guava>代码>表< /> >

。p> 如果我能概括一下你想要完成的事情,那就是根据三件事来查找股票统计数据:feed、ticker和statistic type。在我看来,这个
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);
    }
}
现在,您可以拥有一个
缓存
,在那里您可以基于这个复杂的键快速查找您的值。这应该像嵌套的HashMaps一样执行每一位,并为其添加语义值


你也可以考虑一些变体,其中<代码> SourceSystemIdEnum < /C>和TIKER名称一起构成一个键,<代码> StaseNeNUM/COD>作为第二个键,这些值将进入GuAVA代码>表< /> > .< /P> < p>看起来树是良好的数据结构(如@ Ata建议)。因为没有树的标准JDK实现(?),也不相信添加开源树实现(来自maven),所以我将继续使用现有的嵌套映射。


如果我找到更好的解决方案,我会更新这个答案,因为树似乎是良好的数据结构(正如@Ata所建议的)。因为没有树的标准JDK实现(?),也不相信添加开源树实现(来自maven),所以我将继续使用现有的嵌套映射。
我会更新这个答案,如果我找到更好的解决方案

你需要的是一个树,你能告诉我API pl吗?我认为现在的数据结构的成本可能很高(?),但用于访问深层地图的模板代码是笨拙的thx@Ata。树似乎是正确的,尽管我不确定java中流行的树的实现,但你需要的是一个树,你能告诉我API pl吗?我认为现在的数据结构的成本可能很高(?),但用于访问深层地图的模板代码是笨拙的thx@Ata。树似乎是正确的,尽管我不确定java中流行的树实现是否更新了关于我为什么需要这种数据结构的帖子。我需要间接查找,以便于查找。不确定这是否是一个本质上不寻常的问题(或我的设计),更新了我为什么需要这个数据结构的帖子。我需要间接查找,以便于查找。我不确定这是否是一个不寻常的问题(或我的设计),有趣的观察让我难以理解。但是,我将无法访问特定的分支机构;例如:给我一个特定的股票代码/INTC的所有统计信息;或者给我一个datafeed/NYSE的所有代码的所有统计信息——我使用这些场景在dashboar中显示一组值