在Java中使用多级HashMap的最佳实践

我们有一种情况,我们最终使用多级哈希映射; 也就是说,哈希映射内部的哈希映射,深度为三层或四层。

本能地,这在某个地方感觉不对。 我在这里阅读了有关如何迭代/使用多级哈希映射的post,但几乎没有人说这是什么最好的做法。

为什么多级哈希映射不好,如果有的话,更好的设计是什么?

以下是我们拥有的多级哈希映射的示例设计:

Map map1; class Object1 { String version; Map map2; } class Object2 { Map<String,List> map4; Map map5; } 

只要它们被恰当地抽象化,它就不是那么重要了,但是你在可读性方面让自己陷入了一些讨厌的兔子洞。 没有抽象,维持这一点就成了开发人员不希望另一个人做的噩梦

从本质上讲,你所创造的是一种表格; 第一个密钥是访问更多列的主键。 在简单的一,二或三级设计中,这并不可怕; 你需要三个键来获得一个值。 如果有一个方便的方式来访问它,如下所示,这并不是一个可怕的想法(虽然那里有更好的)。

 public interface Table { V get(K1 key1, K2 key2, K3 key3); } 

…但是,这完全取决于您实际使用的数据结构。 如果您发现自己试图迭代值的中间键(也就是说,您正在查看键3以获取它与键5之间的所有值的集合),那么您必须重新考虑您的业务逻辑。 提供的数据结构不够灵活,无法处理所有情况; 或多或少,它用于基于一组值的简单索引。

或者,可以看一下Guava Table ,因为它做同样的事情,有一个更好的界面(类似于我上面的那个)。

我认为在HashMap中做HashMap是不好的做法,因为为了扩展你的HashMap更深入,将花费你时间和金钱。 从3级深度Map5级深度Map ,您基本上必须重新编码您的类。 在维护这个项目时,这会带来很多技术债务。

在某处声明初始地图

 Map HashKVP = new HashMap(); 

然后有一个Object来存储其他地图。

 class MyHashedObject { private Map InternalKvp; public MyHashedObject() { this.InternalKvp = new HashMap(); } /* * Get the next level of our MyHashedObject object * @param HashKey * @return MyHashedObject result */ public MyHashedObject findHashedObject(String HashKey) { MyHashedObject result = null; if(this.InternalKvp.containsKey(HashKey)) { result = this.InternalKvp.get(HashKey); } return result; } } 

这样,只需将更多对象转储到InternalKvp ,就可以轻松地将更多级别扩展到HashMap

这只是一个非常基本的示例,但您可以向MyHashedObject添加更多属性(例如depthparent_object等)。 您可以执行类似小世界网络的操作 ,以跟踪每个对象的depth

使用RedBlackTreeAVLTree可以更好地完成此操作,以便更轻松地遍历Maps

多级HashMaps不一定是坏的,这取决于你的算法。 糟糕的是,管理起来更加困难。 考虑使用HasMap值的接口(类似于存储库),这可能会使您的设计更清晰。 其他选项是在HashMap中使用复合键。