一个哈希表内部的哈希表如何打印输出

4
我正在尝试打印一个包含字符A作为键和值为另一个哈希映射(其中包含Integer和Double)的哈希映射。我已经有了下面的代码,但它没有起作用。
HashMap<Character, Map<Integer, Double>> MapInsideOfAMap = calc.MapInAMap(abc);
    for (Entry<Character, Map<Integer, Double>> outer : MapInsideOfAMap.entrySet()) {
        System.out.println("Char: " + outer.getKey() + "\n");
        for (Map.Entry<Character, Map<Integer, Double> inner : MapInsideOfAMap.getValue().entrySet()) {
            System.out.println("int = " + inner.getKey() + ", double = " + inner.getValue());
        }
    }

什么是 MapInsideOfAMap,为什么在外层循环中有 Entry<Character, Map<Integer, Double>>(Double),而在内层循环中有 Map.Entry<Integer, Integer>(Integer)? - Betlista
没有名为 getValue() 的映射方法。将其更改为 get(outer.getKey())。此外,您突然从 <Integer,Double> 切换到 <Integer,Integer>。您需要保持一致。 - user6073886
请查看以下链接:https://dev59.com/H3E85IYBdhLWcg3wdDEM#2774626 - xMilos
我已经更新了代码,对于不一致表示抱歉。 - 2345678
7个回答

2
假设您的地图长这样:
Map <Character, Map<Integer, Double>> MapInsideOfAMap = new HashMap();

那么你可以像这样打印你的地图:
for (Entry<Character, Map<Integer, Double>> outer : MapInsideOfAMap.entrySet()) {
    System.out.println("Char: " + outer.getKey() + "\n");
    HashMap<Integer, Double> innermap = MapInsideOfAMap.get(outer.getKey());
    for (Map.Entry<Integer, Double> innerEntry : innermap.entrySet()) {
         System.out.println("int = " + innerEntry.getKey() + ", double = " + innerEntry.getValue());
    }
}

2
你的代码应该像这样,
for (Entry<Character, Map<Integer, Double>> outer : MapInsideOfAMap.entrySet()) {
        System.out.println("Char: " + outer.getKey() + "\n");
        for (Entry<Integer, Double> inner : MapInsideOfAMap.get(outer.getKey()).entrySet()) {
            System.out.println("int = " + inner.getKey() + ", double = " + inner.getValue());
        }
    }

好的,我明白了您想做什么。既然您已经获得了外部地图条目,那么您就不必再次使用外部地图引用,可以直接这样做:

for (Entry<Character, Map<Integer, Double>> outer : MapInsideOfAMap.entrySet()) {
        System.out.println("Char: " + outer.getKey() + "\n");

        for (Entry<Integer, Double> inner : outer.getValue().entrySet()) {
            System.out.println("int = " + inner.getKey() + ", double = " + inner.getValue());
        }
    }

有效的解决方案。但在我看来,你应该避免在每次迭代中使用MapInsideOfAMap.get(outer.getKey()).entrySet(),即使它是O(1)的。但+1。 - osanger
1
@osanger 是的,没错,我只是在尝试修复错误,我更新了我的答案。 - chaitanya89

2
如果你只需要查看地图的键/值,请使用 System.out.printlnAbstractMap.toString 方法知道如何以美观易读的方式打印地图。
Map<Character, Map<Integer, Double>> map = new HashMap<>();
map.put('A', new HashMap<>());
map.get('A').put(1, 0.01);
map.put('B', new HashMap<>());
map.get('B').put(2, 0.02);
System.out.println(map);

打印出这个:
{A={1=0.01}, B={2=0.02}}

0
在第二个for循环中,您需要访问从外部循环获取的Map作为值。您还需要更改第二个循环中Entry的类型。
尝试使用以下代码:
for (Entry<Character, Map<Integer, Double>> outer : MapInsideOfAMap.entrySet()) {
    System.out.println("Key: " + outer.getKey() + "\n");
    for (Entry<Integer, Double> inner : outer.getValue().entrySet()) {
        System.out.println("Key = " + inner.getKey() + ", Value = " + inner.getValue());
    }
}

0

但是这个结构的复杂性可能是多余的。

public static void print(char keyData, Map<Character, Map<Integer, Double>> fromData) {
    System.out.println("print: " + get(keyData, fromData));
}

public static Map<Integer, Double> get(char keyData, Map<Character, Map<Integer, Double>> fromData) {

    for (Map.Entry<Character, Map<Integer, Double>> entry : fromData.entrySet()) {

        Character key = entry.getKey();

        if(key.equals(keyData))
            return entry.getValue();

    }

    return Collections.emptyMap();
}

0

要简单地打印出整个映射的地图:

System.out.println(mapInsideOfAMap);

如果你想迭代你的外部和内部地图并打印它们的键/值对,你可以使用 Map.forEach 方法:

mapInsideOfAMap.forEach((outerKey, outerValue) -> {
    System.out.println("Char: " + outerKey + "\n");
    outerValue.forEach((innerKey, innerValue) -> 
        System.out.println("int = " + innerKey + ", double = " + innerValue));
});

使用Java8 Lambda表达式。 - Pankaj
@Pankaj 是的,Map.forEach 期望一个接收键和值的 BiConsumer,而这个 BiConsumer 可以是 lambda 表达式的目标,使代码更加简洁。 - fps

0
public static void main(String z[]) {

    Map<Character, Map<Integer, Double>> MapInsideOfAMap = getmapOfMap();
    for (Entry<Character, Map<Integer, Double>> outer : MapInsideOfAMap.entrySet()) {
        System.out.println("Char: " + outer.getKey() + "\n");

        Map<Integer, Double> mapInner = MapInsideOfAMap.get(outer.getKey());
        for (Map.Entry<Integer, Double> inner : mapInner.entrySet()) {
             System.out.println(inner.getKey() +":"+ mapInner.get(inner.getKey()));
        }
    }
}

private static Map getmapOfMap() {
    char[] chArr = {'a','b','c','d','e','f','g','h','i','j','k'};
    HashMap<Character, Map<Integer, Double>> mapInsideOfAMap = new HashMap<Character, Map<Integer, Double>>();

    for(char ch:chArr) {
        mapInsideOfAMap.put(ch, getInnterMap());

    }
    return mapInsideOfAMap;
}

private static Map getInnterMap() {
     Map<Integer, Double> map = new HashMap<>();

     for(int i=1000;i<1010;i++) {
         map.put(i, new Double(String.valueOf(i)));
     }
     return map;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接