有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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;
}

共 (3) 个答案

  1. # 1 楼答案

    我认为在HashMap内执行HashMap是一种不好的做法,因为为了扩展HashMap使其更深入,将花费您的时间和金钱。从3级别的深度Map5级别的深度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;
        }
    
    
    
    
    }
    

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

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

    这也可以做得更好,使用RedBlackTreeAVLTree可以更容易地遍历Maps

  2. # 2 楼答案

    多级哈希映射并不一定是坏的,这取决于您的算法。 糟糕的是,管理起来更加困难。 考虑使用HasMad值的接口(比如存储库),这样可以使设计更加干净。 另一种选择是在HashMap中使用复合键

  3. # 3 楼答案

    只要它们被适当地抽象,这并不是什么大不了的事,但在可读性方面,你会把自己引向一些讨厌的兔子洞。如果没有抽象,维护它将成为一场噩梦,任何开发人员都不会希望它发生在其他人身上

    本质上,您所创建的是一个排序表;第一个键是访问更多列的主键。在简单的一级、二级或三级设计中,这并不可怕;需要三个键才能获得单个值。如果有一种方便的方式访问它,如下面所示,这不是一个糟糕的想法(尽管有更好的方法)

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

    。。。然而,这一切都取决于您对该数据结构的实际操作。如果您发现自己试图迭代值的中间键(也就是说,您正在查看键3以获取它和键5之间的所有值的集合),那么此时您必须重新考虑您的业务逻辑。提供的数据结构不够灵活,无法处理所有案例;或多或少,它用于基于一组值的简化索引

    或者,我们可以研究一个Guava ^{},因为它做同样的事情,有一个更好的接口(类似于我上面的接口)