我们有一种情况,我们最终使用多级散列映射;即,散列映射中的一个散列映射,深度为三到四级。
本能地,这让人感觉不对劲。我在这里读过关于如何迭代/使用多级散列映射的帖子,但几乎没有一个帖子提到了这方面的最佳实践。
为什么多级散列映射不好,如果有更好的设计,会是什么?
下面是我们拥有的多级散列映射的示例设计:
Map<String, Object1> map1;
class Object1 {
String version;
Map<String,Object2> map2;
}
class Object2 {
Map<String,List<Object3>> map4;
Map<String,String> map5;
}
发布于 2015-07-15 13:59:50
只要对它们进行了适当的抽象,这并不是什么大问题,但在可读性方面,您会让自己陷入一些令人讨厌的兔子洞。如果没有抽象,维护它将成为一个噩梦,这是任何开发人员都不希望发生在另一个上的。
从本质上讲,您正在创建的是一个排序表;第一个键是访问更多列的主键。在简单的一层、两层或三层设计中,这并不可怕;您需要三个键才能获得单个值。如果有一个方便的方法来访问它,就像下面这样,这不是一个糟糕的想法(尽管有更好的方法)。
public interface Table<K1, K2, K3, V> {
V get(K1 key1, K2 key2, K3 key3);
}
...However,这完全取决于您实际对该数据结构做了什么。如果您发现自己正在尝试为值迭代中间键(也就是说,您正在查看键3以获取它和键5之间的所有值的集合),那么在这一点上您必须重新考虑业务逻辑。提供的数据结构不够灵活,不足以处理所有情况;或多或少,它用于基于一组值的简单索引。
或者,人们可以研究一下Guava Table
,因为它可以做同样的事情,具有更好的接口(类似于我上面的那个)。
发布于 2015-07-15 14:05:46
我认为在HashMap
中做HashMap
是一种糟糕的做法,因为为了让你的HashMap更深入,会耗费你的时间和金钱。从3
level depth Map
到5
level depth Map
,你必须重新编写你的类。当涉及到维护这个程序时,这将会带来大量的技术债务。
在某个地方声明初始Map
Map<String, MyHashedObject> HashKVP = new HashMap<String, MyHashedObject>();
然后有一个Object
来存储额外的地图。
class MyHashedObject {
private Map<String, MyHashedObject> InternalKvp;
public MyHashedObject() {
this.InternalKvp = new HashMap<String, MyHashedObject>();
}
/*
* 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;
}
}
这只是一个非常基本的示例,但您可以向MyHashedObject
添加更多属性(如depth
、parent_object
等)。您可以执行类似Small-world network的操作来跟踪每个对象的depth
。
发布于 2015-07-15 14:04:11
多级HashMaps不一定不好,这取决于你的算法。不好的是,它更难管理。考虑对HasMap值使用接口(如存储库),这可能会使您的设计更简洁。另一种选择是在HashMap中使用组合键。
https://stackoverflow.com/questions/31422443
复制相似问题