关于Java:如何为每个HASMAP for each

How to for each the hashmap?

本问题已经有最佳答案,请猛点这里访问。

我有这个领域:

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

对于每个Hash,我需要创建一个ComboBox,其项是HashMap 的值(恰好是hashmap本身)。

通过(不起作用)演示:

1
2
3
4
5
6
7
8
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);
    }
}


我知道我有点晚了,但我也会分享我的所作所为,以防它对其他人有所帮助:

1
2
3
4
5
6
7
8
9
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)中,通过使用类似于迭代接口的迭代器的聚合操作(流操作),这变得更加容易。

只需将下面的粘贴语句复制到代码中,并将hashmap变量从hm重命名为hashmap变量,即可打印出键值对。

1
2
3
4
5
6
7
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));

下面是使用lambda表达式的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    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

也可以使用拆分器。

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

更新

包括指向Oracle文档的文档链接。有关lambda的更多信息,请转到此链接,并且必须读取聚合操作;对于spliterator,请转到此链接。


Map.values()

1
2
3
4
5
6
7
8
9
10
11
12
13
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和许多其他集合,例如:

1
2
3
4
5
6
7
8
9
HashMap<T,U> map = new HashMap<T,U>();

...

Iterator it = map.values().iterator();

while (it.hasNext()) {
    System.out.println(it.next());
}


流Java 8

随着EDCOX1×3的方法接受lambda表达式,我们也得到了流API,在Java 8中。

迭代条目(使用foreach和streams):

1
2
3
4
5
6
7
8
9
10
11
sample.forEach((k,v) -> System.out.println(k +"=" + v));
sample.entrySet().stream().forEachOrdered((entry) -> {
            Object currentKey = entry.getKey();
            Object currentValue = entry.getValue();
            System.out.println(currentKey +"=" + currentValue);
        });
sample.entrySet().parallelStream().forEach((entry) -> {
            Object currentKey = entry.getKey();
            Object currentValue = entry.getValue();
            System.out.println(currentKey +"=" + currentValue);
        });

流的优点是它们可以很容易地并行化,并且在我们有多个CPU可供使用时非常有用。我们只需要使用parallelStream()代替上面的stream()。对于并行流,使用forEach更有意义,因为forEachOrdered对性能没有影响。如果我们想迭代键,可以使用sample.keySet()和值sample.values()

为什么forEachOrdered而不是forEach有溪流?

流也提供了forEach方法,但是forEach的行为是明确不确定的,因为forEachOrdered对该流的每个元素执行一个动作,如果流有一个定义的遭遇顺序,则按照流的遭遇顺序执行。因此,forEach并不能保证订单的有效性。还要查看更多信息。


我通常与cx42net做相同的工作,但是我没有显式地创建一个条目。

1
2
3
4
5
6
7
8
9
10
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));
    }
}

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


使用entrySet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
 *Output:
D: 99.22
A: 3434.34
C: 1378.0
B: 123.22
E: -19.08

B's new balance: 1123.22
 */


import java.util.HashMap;
import java.util.Map;
import java.util.Set;

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

    HashMap<String, Double> hm = new HashMap<String, Double>();

    hm.put("A", new Double(3434.34));
    hm.put("B", new Double(123.22));
    hm.put("C", new Double(1378.00));
    hm.put("D", new Double(99.22));
    hm.put("E", new Double(-19.08));

    Set<Map.Entry<String, Double>> set = hm.entrySet();

    for (Map.Entry<String, Double> me : set) {
      System.out.print(me.getKey() +":");
      System.out.println(me.getValue());
    }

    System.out.println();

    double balance = hm.get("B");
    hm.put("B", balance + 1000);

    System.out.println("B's new balance:" + hm.get("B"));
  }
}

请参阅以下完整示例:

  • http://www.java2s.com/code/javaapi/java.util/hashmapentryset.htm(http://www.java2s.com/code/javaapi/java.util/hashmapentryset.htm)