【问题标题】:How to put/get values into/from Nested HashMap如何将值放入/从嵌套的 HashMap 中获取
【发布时间】:2013-01-29 12:11:51
【问题描述】:

我想创建一个嵌套的 HashMap,它将接受两个浮点类型的键并给出整数类型的值。

 public static HashMap<Float, HashMap<Float, Integer>> hashX = new HashMap<Float,HashMap<Float, Integer>>();

是否有一种简单的方法可以像普通的 HashMap 一样放置/获取值,即

  hashX.put(key, value);
  hashX.get(key);

还是必须使用更复杂的方法? 我在网上搜索了解决方案,但发现很难找到适用于我的解决方案。任何帮助将不胜感激!

【问题讨论】:

  • 你应该在你的类型声明中使用像Map&lt;Float, HashMap&lt;Float, Integer&gt;&gt;这样的Map接口。

标签: java hashmap nested


【解决方案1】:
Map<Float, Map<Float, Integer>> map = new HashMap<>();

map.put(.0F, new HashMap(){{put(.0F,0);}});
map.put(.1F, new HashMap(){{put(.1F,1);}});

map.get(.0F).get(.0F);

【讨论】:

  • 然后臭名昭著的实例初始化程序块出现了。 :)
  • 这是一个NullPointerException,因为map.get(0) 将返回null
  • @isvforall 谢谢,有没有使用 HashMap(),我使用的是 Android,我不能使用 1.7 级,因为 Android 需要 5.0
  • @user1927105 不幸的是,只有HashMap&lt;Float, Map&lt;Float, Integer&gt;&gt;();
  • @JanacMeena 这是主观的,但我认识的大多数人(包括我)都不喜欢它,因为它使代码更难阅读和推理。
【解决方案2】:

你要get()嵌套的map脱离外层map,调用可以调用put()get()就可以了

float x = 1.0F;
HashMap<Float, Integer> innerMap = hashX.get(x);
if (innerMap == null) {
    hashX.put(x, innerMap = new HashMap<>()); // Java version >= 1.7
}
innerMap.put(2.0F, 5);

【讨论】:

    【解决方案3】:

    试试这个。

    static <K0, K1, V> void put(Map<K0, Map<K1, V>> map, K0 k0, K1 k1, V value) {
        map.computeIfAbsent(k0, x -> new HashMap<>()).put(k1, value);
    }
    
    static <K0, K1, V> V get(Map<K0, Map<K1, V>> map, K0 k0, K1 k1) {
        return Optional.ofNullable(map.get(k0)).map(s -> s.get(k1)).orElse(null);
    }
    

    Map<Float, Map<Float, Float>> map = new HashMap<>();
    put(map, 1F, 2F, 3F);
    put(map, 4F, 5F, 6F);
    System.out.println(map);
    

    输出:

    {4.0={5.0=6.0}, 1.0={2.0=3.0}}
    

    或者干脆

    Map<Float, Map<Float, Float>> map = Map.of(
        1F, Map.of(2F, 3F),
        4F, Map.of(5F, 6F));
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      HashMap<Float, Integer> h1 = new HashMap<Float, Integer>();
      h1.put(1.0f,new Integer(1));
      HashMap<Float, Integer> h2 = new HashMap<Float, Integer>();
      h2.put(3.0f,new Integer(3));
      
      hashX.put(1.0f, h1);
      hashX.put(1.0f, h1);
      

      【讨论】:

        【解决方案5】:

        你可以用这样的方法创建一个包装类:

        public class MyWrapper {
            private Map<Float, Map<Float, Integer>> hashX;
            // ...
            public void doublePut(Float one, Float two, Integer value) {
                if (hashX.get(one) == null) {
                    hashX.put(one, new HashMap<Float, Integer>());
                }
              hashX.get(one).put(two, value);
            }
        }
        

        请注意,在声明字段时,您应该使用接口而不是具体实现。例如,如果需要,将HashMap 重构为ConcurrentHashMap 会更容易。

        【讨论】:

        • 你为什么不保存对新地图的引用,以避免下面的查找操作,就像你在我的回答中看到的那样?
        • 嗯,这看起来是一种更惯用的方式。
        【解决方案6】:
        package com.Collection;
        
        import java.util.*;
        
        public class India {
        
            public static void main(String[] args) {
                Set s = new TreeSet();
                s.add("Barshi");
                s.add("Pandharpur");
                s.add("Kurduwadi");
                s.add("Vairag");
                Map<String,Map<String,Map<String,TreeSet>>> map =               
                        Map.of("India", Map.of("Maharashtra", Map.of("Solapur", new TreeSet(s))));
                        
                System.out.println(map);
                System.out.println(map.get("India").get("Maharashtra").get("Solapur").contains("Barshi"));
            }
        
        }
        

        【讨论】:

          【解决方案7】:

          我想创建一个嵌套的 HashMap,它将接受两个浮点类型的键并给出整数类型的值。

          您不需要为此使用嵌套地图。如果您想使用复合键进行查找,最好将您的地图声明为这样。 JFK 中没有好的 Pair 类,但您可以使用 Map.Entry,使用起来有些不方便,但可以:

          Map<Map<Float, Float>, Integer> map = new ....
          

          请参阅 https://stackoverflow.com/a/3110563/18573 以创建 Map.Entry 实例

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-08-04
            • 2017-03-12
            • 1970-01-01
            • 1970-01-01
            • 2013-08-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多