如何在Java中访问嵌套的HashMaps?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Java中访问嵌套的HashMaps?相关的知识,希望对你有一定的参考价值。

我在Java中有一个HashMap,可以访问其中的内容(大家都知道)

HashMap.get("keyname");

如果在另一个HashMap中有一个HashMap,即嵌套的HashMap,我将如何访问内容?我可以这样做,内联:

HashMap.get("keyname").get("nestedkeyname");

谢谢。

答案

你可以像你想象的那样做。但是你的HashMap必须是模板化的:

Map<String, Map<String, String>> map = 
    new HashMap<String, Map<String, String>>();

否则,在从第一个地图中检索第二个地图后,您必须对Map进行强制转换。

Map map = new HashMap();
((Map)map.get( "keyname" )).get( "nestedkeyname" );
另一答案

是。

看到:

public static void main(String args[]) {

    HashMap<String, HashMap<String, Object>> map = new HashMap<String, HashMap<String,Object>>();
    map.put("key", new HashMap<String, Object>());
    map.get("key").put("key2", "val2");

    System.out.println(map.get("key").get("key2"));
}
另一答案

正如其他人所说,你可以这样做,但你应该用泛型定义地图,如下所示:

Map<String, Map<String, String>> map = new HashMap<String, Map<String,String>>();

但是,如果你只是盲目地运行以下内容:

map.get("keyname").get("nestedkeyname");

只要keyname不在地图中,你的程序就会崩溃,你会得到一个空指针异常。你真的应该添加以下检查:

String valueFromMap = null;
if(map.containsKey("keyname")){
  valueFromMap = map.get("keyname").get("nestedkeyname");
}
另一答案

如果您计划构建具有可变深度的HashMaps,请使用递归数据结构。

以下是提供示例界面的实现:

class NestedMap<K, V> {

    private final HashMap<K, NestedMap> child;
    private V value;

    public NestedMap() {
        child = new HashMap<>();
        value = null;
    }

    public boolean hasChild(K k) {
        return this.child.containsKey(k);
    }

    public NestedMap<K, V> getChild(K k) {
        return this.child.get(k);
    }

    public void makeChild(K k) {
        this.child.put(k, new NestedMap());
    }

    public V getValue() {
        return value;
    }

    public void setValue(V v) {
        value = v;
    }
}

和示例用法:

class NestedMapIllustration {
    public static void main(String[] args) {

        NestedMap<Character, String> m = new NestedMap<>();

        m.makeChild('f');
        m.getChild('f').makeChild('o');
        m.getChild('f').getChild('o').makeChild('o');
        m.getChild('f').getChild('o').getChild('o').setValue("bar");

        System.out.println(
            "nested element at 'f' -> 'o' -> 'o' is " +
            m.getChild('f').getChild('o').getChild('o').getValue());
    }
}
另一答案

是的,如果您为外部hashmap使用正确的泛型类型签名。

HashMap<String, HashMap<String, Foo>> hm = new HashMap<String, HashMap<String, Foobar>>();
// populate the map
hm.get("keyname").get("nestedkeyname");

如果你不使用泛型,你必须进行转换才能将从外部哈希映射中检索到的对象转换为HashMap(或者至少是Map),然后才能调用它的get()方法。但你应该使用泛型;-)

另一答案

我更喜欢创建一个扩展HashMap的自定义地图。然后重写get()以添加额外的逻辑,以便在地图不包含您的密钥时。它将创建嵌套映射的新实例,添加它,然后返回它。

public class KMap<K, V> extends HashMap<K, V> {

    public KMap() {
        super();
    }

    @Override
    public V get(Object key) {
        if (this.containsKey(key)) {
            return super.get(key);
        } else {
            Map<K, V> value = new KMap<K, V>();
            super.put((K)key, (V)value);
            return (V)value;
        }
    }
}

现在您可以像这样使用它:

Map<Integer, Map<Integer, Map<String, Object>>> nestedMap = new KMap<Integer, Map<Integer, Map<String, Object>>>();

Map<String, Object> map = (Map<String, Object>) nestedMap.get(1).get(2);
Object obj= new Object();
map.put(someKey, obj);
另一答案

我来到这个StackOverflow页面,寻找从objc中得知的ala valueForKeyPath。我也来了另一个帖子 - "Key-Value Coding" for Java,但最终写了我自己的。

在aache qazxsw poi库中,我仍然在寻找比qazxsw poi更好的解决方案。

用法

PropertyUtils.getProperty

履行

beanutils
另一答案

我在尝试弄清楚如何从未知深度的嵌套地图中获取值时进行了讨论,这有助于我为我的问题提出以下解决方案。这对于原始问题来说是过度的,但对于那些发现自己处于对搜索地图知之甚少的情况的人来说,这可能会有所帮助。

Map<String, Object> json = ...
public String getOptionalFirstName() {
    return MyCode.getString(json, "contact", "firstName");
}

以上是关于如何在Java中访问嵌套的HashMaps?的主要内容,如果未能解决你的问题,请参考以下文章

鉴于 jdk1.6 及更高版本中的 HashMaps 导致多线程问题,我应该如何修复我的代码

Java中的HashMaps - 索引与否

-Java基础-方法

-Java基础-方法

-Java基础-方法

java 使用Hashmaps检查Anagrams