0

I have this Map where the key is an Integer and the value is another map. I want to know how to iterate through the second map.

private Map<Integer,Map<Integer,Integer>> transition = new HashMap<Integer, Map<Integer, Integer>>();
laura
  • 2,085
  • 13
  • 36
  • 68

4 Answers4

1
private Map<Integer,Map<Integer,Integer>> transition = new HashMap<Integer, Map<Integer, Integer>>();
for (Integer outerKey : transition.keySet()) {
    Map<Integer, Integer> inner = transition.get(outerKey);
    for (Integer innerKey : inner.keySet()) {
        Integer value = inner.get(innerKey);
    }
}
angel_navarro
  • 1,757
  • 10
  • 11
  • If you want the key and the values, iterate over the entryset. Do NOT iterate over keys and call map.get for each key. http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#entrySet() – Brett Okken Apr 25 '14 at 13:58
  • There are several options. Which one you use depend of your preferences ;) – angel_navarro Apr 25 '14 at 14:01
  • Iterating over the entryset is a constant cost (n). Iterating over keys and calling get for each key is n * access time. The access time is going to grow with size of the map. http://stackoverflow.com/questions/1066589/java-iterate-through-hashmap – Brett Okken Apr 25 '14 at 14:55
1

+1 @angel_navarro Another way is using entry set

    Map<Integer, HashMap<Integer, Integer>> map = new HashMap<Integer, HashMap<Integer, Integer>>();
    for (Map.Entry<Integer, HashMap<Integer, Integer>> entry : map.entrySet()) {
        HashMap<Integer, Integer> submap = entry.getValue();
        for (Map.Entry<Integer, Integer> sub_entry : submap.entrySet()) {
            System.out.println("Key = " + entry.getKey() + ", Value = "
                    + entry.getValue());
        }
    }
niiraj874u
  • 2,180
  • 1
  • 12
  • 19
0

I like this idiom better:

for(Map.Entry<Integer,Map<Integer,Integer>> outer : transition.entrySet()){
  Integer outerKey = outer.getKey();
  for(Map.Entry<Integer,Integer> inner : outer.getValue().entrySet()){
    Integer innerKey = inner.getKey();
    Integer innerValue = inner.getValue();
  }
}

By the way, I suggest you take a look at Guava's new collection types, e.g., Multimap, for alternatives to nested collections. Maybe they won't fit your use case today, but it's good to know they exist.

Giovanni Botta
  • 9,626
  • 5
  • 51
  • 94
0
private Map<Integer,Map<Integer,Integer>> transition = new HashMap<Integer, Map<Integer, Integer>>();
for(Map.Entry<Integer,Map<Integer,Integer>> entryMap : transition.values())
{
   final Integer outerKey = entryMap.getKey();
   for (Map.Entry<Integer, Integer> entry : entryMap.getValue().entrySet())
   {
       final Integer innerKey = entry.getKey();
       final Integer innerValue = entry.getValue();
   }
}
Brett Okken
  • 6,210
  • 1
  • 19
  • 25