提问人:Mediator 提问时间:11/21/2010 最后编辑:JarvisMediator 更新时间:12/23/2018 访问量:924500
如何为每个哈希图?[复制]
How to for each the hashmap? [duplicate]
问:
我有这个字段:
HashMap<String, HashMap> selects = new HashMap<String, HashMap>();
对于每个,我都需要创建一个 ,其项目是 的值(恰好是 HashMap 本身)。Hash<String, HashMap>
ComboBox
HashMap <String, **HashMap**>
通过(非功能)演示:
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);
}
}
答:
用entrySet
/**
*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"));
}
}
在此处查看完整示例:
评论
HashMap<String, HashMap>
HashMap<String, Set<String>>
Map<String, Map>
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<String, HashMap<SomeInnerKeyType, String>>
this.selects
selects
HashMap<SomeInnerKeyType, String>
this->String
selects.get(keyString)
您可以使用迭代器遍历一个(以及许多其他集合),例如:HashMap
HashMap<T,U> map = new HashMap<T,U>();
...
Iterator it = map.values().iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
评论
it.next()
我知道我有点晚了,但我也会分享我所做的事情,以防它对其他人有帮助:
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.
}
评论
我通常执行与 cx42net 相同的操作,但我没有显式创建 Entry。
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));
}
}
这对我来说似乎是最直观的,我认为我对迭代地图的值有偏见。
评论
Lambda表达式 Java 8
在 Java 1.8 (Java 8) 中,通过使用 Aggregate 操作(Stream 操作)中的 forEach 方法,这变得容易得多,该方法看起来类似于 Iterable Interface 中的迭代器。
只需将以下语句复制粘贴到您的代码中,并将 HashMap 变量从 hm 重命名为 HashMap 变量即可打印出键值对。
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 表达式的示例:
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();
更新
包括指向 Oracle Docs 的文档链接。 有关 Lambda 的更多信息,请转到此链接,并且必须阅读聚合操作,对于 Spliterator,请转到此链接。
评论
Local variable schedule defined in an enclosing scope must be final or effectively final
流 Java 8
除了接受 lambda 表达式的方法外,我们还在 Java 8 中提供了流 API。forEach
遍历条目(使用 forEach 和 Streams):
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 可供使用时,它们会很有用。我们只需要用 in 代替上面的。使用并行流更有意义,因为不会对性能产生任何影响。如果我们想遍历键,我们可以使用 和 for 值 。parallelStream()
stream()
forEach
forEachOrdered
sample.keySet()
sample.values()
为什么 forEachOrdered
而不是 forEach
与流?
流也提供方法,但其行为是明确的非确定性的,因为 如果流具有定义的相遇顺序,则在流的相遇顺序中,为此流的每个元素执行操作。所以不保证订单会被保留。另请查看此内容以了解更多信息。forEach
forEach
forEachOrdered
forEach
评论