如何为每个哈希映射?

我有这个领域:

HashMap<String, HashMap> selects = new HashMap<String, HashMap>(); 

对于每个Hash<String, HashMap>我需要创build一个ComboBox ,其项目是HashMap <String, **HashMap**>的值(恰好是HashMap本身)。

通过(非function性)演示的方式:

 for (int i=0; i < selects.size(); i++) { HashMap h = selects[i].getValue(); ComboBox cb = new ComboBox(); for (int y=0; y < h.size(); i++) { cb.items.add(h[y].getValue); } } 

我知道我已经有点晚了,但是我也会分享我的工作,以防别人帮忙:

 HashMap<String, HashMap> selects = new HashMap<String, HashMap>(); for(Map.Entry<String, HashMap> entry : selects.entrySet()) { String key = entry.getKey(); HashMap value = entry.getValue(); // do what you have to do here // In your case, another loop. } 

Lambda Expression Java 8

在Java 1.8(Java 8)中,通过使用类似于Iterable Interface的迭代器的Aggregate操作( Stream操作 )中的forEach方法,这变得更容易了。

只需将下面的语句复制粘贴到您的代码中,并将HashMapvariables从hm重命名为您的HashMapvariables以打印出键值对。

 HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>(); /* * Logic to put the Key,Value pair in your HashMap hm */ // Print the key value pair in one line. hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v)); 

以下是使用Lambdaexpression式的示例:

  HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>(); Random rand = new Random(47); int i=0; while(i<5){ i++; int key = rand.nextInt(20); int value = rand.nextInt(50); System.out.println("Inserting key: "+key+" Value: "+value); Integer imap =hm.put(key,value); if( imap == null){ System.out.println("Inserted"); } else{ System.out.println("Replaced with "+imap); } } hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v)); Output: Inserting key: 18 Value: 5 Inserted Inserting key: 13 Value: 11 Inserted Inserting key: 1 Value: 29 Inserted Inserting key: 8 Value: 0 Inserted Inserting key: 2 Value: 7 Inserted key: 1 value:29 key: 18 value:5 key: 2 value:7 key: 8 value:0 key: 13 value:11 

也可以使用相同的Spliterator

 Spliterator sit = hm.entrySet().spliterator(); 

UPDATE


包括Oracle Docs的文档链接。 有关Lambda的更多信息,请转到此链接,并阅读Aggregate Operations和Spliterator,然后转到此链接 。

Map.values()

 HashMap<String, HashMap<SomeInnerKeyType, String>> selects = new HashMap<String, HashMap<SomeInnerKeyType, String>>(); ... for(HashMap<SomeInnerKeyType, String> h : selects.values()) { ComboBox cb = new ComboBox(); for(String s : h.values()) { cb.items.add(s); } } 

您可以使用迭代器遍历HashMap (和许多其他集合),例如:

 HashMap<T,U> map = new HashMap<T,U>(); ... Iterator it = map.values().iterator(); while (it.hasNext()) { System.out.println(it.next()); } 

我通常做cx42net相同,但我没有明确创build一个条目。

 HashMap<String, HashMap> selects = new HashMap<String, HashMap>(); for (String key : selects.keySet()) { HashMap<innerKey, String> boxHolder = selects.get(key); ComboBox cb = new ComboBox(); for (InnerKey innerKey : boxHolder.keySet()) { cb.items.add(boxHolder.get(innerKey)); } } 

这对我来说似乎是最直观的,我认为我对迭代地图的价值观产生了偏见。

正如已经提到的那样,在Java 8中,我们得到了接受lambdaexpression式的 forEach方法。 但是我们也有stream API。

迭代条目(使用forEach和Streams):

 sample.forEach((k,v) -> System.out.println(k + "=" + v)); sample.entrySet().stream().forEach((entry) -> { Object currentKey = entry.getKey(); Object currentValue = entry.getValue(); System.out.println(currentKey + "=" + currentValue); }); 

stream的优点是它们可以很容易地并行化,并且当我们有多个CPU可供使用时可以是有用的。 我们只需要使用parallelStream()代替上面的stream() 。 如果我们想遍历键,我们可以使用sample.keySet()和值sample.values()