在Java中使用多级HashMap的最佳实践
我们的情况是,我们最终使用多级哈希映射;也就是说,一个哈希映射中的一个哈希映射,有三到四个层次
本能地,这在某个地方感觉不对劲。我在这里读过关于如何迭代/使用多级散列映射的帖子,但几乎没有一篇文章说这方面的最佳实践是什么
为什么多层散列映射不好,如果有更好的设计,什么是更好的设计
下面是我们拥有的多级哈希映射的示例设计:
Map<String, Object1> map1;
class Object1 {
String version;
Map<String,Object2> map2;
}
class Object2 {
Map<String,List<Object3>> map4;
Map<String,String> map5;
}
# 1 楼答案
我认为在
HashMap
内执行HashMap
是一种不好的做法,因为为了扩展HashMap使其更深入,将花费您的时间和金钱。从3
级别的深度Map
到5
级别的深度Map
,基本上需要重新编写类代码。在维护这个项目时,这将带来大量的技术债务在某处声明初始映射
然后使用
Object
来存储其他映射这样,只需将更多对象转储到
InternalKvp
中,就可以轻松地将更多级别扩展到HashMap
这只是一个非常基本的示例,但是您可以向
MyHashedObject
添加更多属性(例如depth
、parent_object
等)。您可以执行类似Small-world network的操作来跟踪每个对象的depth
这也可以做得更好,使用
RedBlackTree
或AVLTree
可以更容易地遍历Maps
# 2 楼答案
多级哈希映射并不一定是坏的,这取决于您的算法。 糟糕的是,管理起来更加困难。 考虑使用HasMad值的接口(比如存储库),这样可以使设计更加干净。 另一种选择是在HashMap中使用复合键
# 3 楼答案
只要它们被适当地抽象,这并不是什么大不了的事,但在可读性方面,你会把自己引向一些讨厌的兔子洞。如果没有抽象,维护它将成为一场噩梦,任何开发人员都不会希望它发生在其他人身上
本质上,您所创建的是一个排序表;第一个键是访问更多列的主键。在简单的一级、二级或三级设计中,这并不可怕;需要三个键才能获得单个值。如果有一种方便的方式访问它,如下面所示,这不是一个糟糕的想法(尽管有更好的方法)
。。。然而,这一切都取决于您对该数据结构的实际操作。如果您发现自己试图迭代值的中间键(也就是说,您正在查看键3以获取它和键5之间的所有值的集合),那么此时您必须重新考虑您的业务逻辑。提供的数据结构不够灵活,无法处理所有案例;或多或少,它用于基于一组值的简化索引
或者,我们可以研究一个Guava ^{} ,因为它做同样的事情,有一个更好的接口(类似于我上面的接口)