【问题标题】:storing hashMap in a hashMap将 hashMap 存储在 hashMap 中
【发布时间】:2011-02-20 11:24:11
【问题描述】:

我正在从一个文本文件中读取数据,并希望将 HashMap 存储在另一个 HashMap 中。

HashMap<string,HashMap<string,value>>

如何存储和检索数据? 任何示例代码将不胜感激... 谢谢你

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    例子:

    创建和填充地图

    Map<String, Map<String, Value>> outerMap = new HashMap<String, HashMap<String, Value>>();
    Map<String, Value> innerMap = new HashMap<String, Value>();    
    innerMap.put("innerKey", new Value());
    

    存储地图

    outerMap.put("key", innerMap);
    

    检索地图及其值

    Map<String, Value> map = outerMap.get("key");
    Value value = map.get("innerKey");
    

    【讨论】:

    • 注意:在java中它的String带有一个上S。
    • 编辑:Map> outerMap = new HashMap>();我遇到了类型不匹配异常。
    • @Johan 如果将内图放入外图后需要更新怎么办?能做到吗?
    • @Sohaib 你必须获取()innerMap,更新它然后再放一次。
    • @LukeChamberlain 我不认为 put() 再次是必需的,因为 get 会返回一个引用。只需 get() 并更新它就足够了。我昨天做了一些实验,效果很好。
    【解决方案2】:

    创建两个简单的 Hashmap:InnerMap 和 OuterMap

        HashMap<String, HashMap<String, String>> outerMap = new HashMap<String, HashMap<String,String>>();
        HashMap<String, String> innerMap = new HashMap<String, String>();
    

    填充哈希映射

        innerMap.put("InnerKey", "InnerValue");
        outerMap.put("OuterKey", innerMap);
    

    从 HashMap 中检索值

        String value = ((HashMap<String, String>)outerMap.get("OuterKey")).get("InnerKey").toString();
        System.out.println("Retreived value is : " + value);
    

    【讨论】:

    • 对于outerMap中的每个键,存储innerMap的相同实例是没有用的,它与没有outerMap相同。您应该为outerMap 中的每个新键创建一个“内部映射”的新实例。
    • @Trinidad:这绝对正确。对于outermap 中的每个新键,都会有一个innerMap 的新实例。我只是想演示“如何用一个键填充 outermap 中的值,然后只是检索它的值”。
    • 哦,但是在同一个地方实例化两个地图会令人困惑,您应该将新内部地图实例的创建与填充它的代码放在一起。 =)
    • 所以你正在嵌套 Hashmaps,但为了避免检索内部的,你每次都重新创建它。这是对性能的浪费。
    【解决方案3】:

    你得到的东西看起来像一个二维 HashMap,可以这么说。这意味着您需要 2 个字符串来存储一个值,也需要检索一个。

    例如,您可以编写一个类来包装这种复杂性,就像那样(未经测试的代码):

    public class HashMap2D<T> {
        private HashMap<String,HashMap<String,T>> outerMap;
    
        public HashMap2D() {
            outerMap = new HashMap<String,HashMap<String,T>>();
        }
    
        public void addElement(String key1, String key2, T value) {
            innerMap=outerMap.get(key1);
            if (innerMap==null) {
                innerMap = new HashMap<String,T>();
                outerMap.put(key1,innerMap);
            }
            innerMap.put(key2,value);
        }
    
        public T getElement(String key1, String key2) {
            Hashmap innerMap = outerMap.get(key1);
            if (innerMap==null) {
                return null;
            }
            return innerMap.get(key2);
        }
    }
    

    如果您希望方法一次处理多个数据,则更复杂,但遵循相同的原则。

    【讨论】:

      【解决方案4】:

      这将通过使用双键将两个嵌套地图展平为一张大地图来解决使用一张地图的相同问题(尽管这并不能直接回答您的问题)。

      public class Key2D{
        private final String outer;
        private final String inner;
      
        public Key2D(String outer, String inner){
          this.outer = outer;
          this.inner = inner;
        }
      
        //include default implementations for
        //Object.equals(Object) and Object.hashCode()
        //Tip: If you're using Eclipse it can generate
        //them for you.
      }
      

      然后用双键创建一张地图:

      Map<Key2D, Value> map = new HashMap<Key2D, Value>();
      map.put(new Key2D("outerKey", "innerKey"), "Value");
      map.get(new Key2D("outerKey", "innerKey")); // yields "Value"
      

      这给出了一个更短的解决方案。性能方面可能差不多。内存性能可能稍好一些(不过只是猜测)。

      【讨论】:

        【解决方案5】:

        HashMap 中的HashMap 会导致可读性问题,尤其是当它超出两个级别时。我假设当您从文本文件中读取数据时,您希望对来自行和列的输入进行分类,这应该类似于多级类别或类别中的类别。如果您可以发布示例数据和您的意图,我可以提出一个自定义类示例。

        public class Category {
          private List<Category> subCategories;
          private List<Item> items;
        }
        

        上述数据结构将帮助您在对数据进行分类时解决任何级别的嵌套。此示例特定于商店商品的分类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多