Java中用于字典的foreach循环

13

我想在Java中遍历字典中的每个项。为了澄清我的意图,这是C#代码:

Dictionary<string, Label> LableList = new Dictionary<string, Label>();
foreach (KeyValuePair<string, Label> z in LabelList);

我不知道如何在Java中实现这个,例如我做了这个:

for(Object z: dic)

但它说它不可迭代。请给予建议......

5个回答

41
我假设你有一个Map<String, Label>,它是Java内置的字典结构。Java不允许直接迭代Map(即它没有实现Iterable),因为这会导致你要迭代什么变得模糊不清。

这只是选择通过键、值或条目(两者兼备)进行迭代的问题。

例如:

Map<String, Label> map = new HashMap<String, Label>();
//...

for ( String key : map.keySet() ) {
}

for ( Label value : map.values() ) {
}

for ( Map.Entry<String, Label> entry : map.entrySet() ) {
    String key = entry.getKey();
    Label value = entry.getValue();
}

你的 C# 代码似乎与迭代条目的方式相同(最后一个示例)。


这是我的定义: Dictionary <String, Label> dic = null; 我不知道Map是什么...它是某种字典吗? - Daniel
4
阅读Javadoc会告诉你:“注意:这个类已经过时了,新的实现应该实现Map接口,而不是扩展这个类。”因此,你应该使用新的映射类之一。你可能需要一个HashMap - 它也实现了你需要让可迭代工作的新函数。 - Voo
1
太神奇了,我早已忘记Hashtable有一个Dictionary超类。 - Mark Peters
1
@Mark 是的,我也不得不查一下,我的第一反应是“等等,Java甚至没有字典,你到底在干什么?”。字典在1.2中被取代了(只是为了展示它有多古老:1.2是Sun的JVM首次包含JIT的版本)。 - Voo

6

java.util.Map 是一个类似于字典的数据结构,下面是一个遍历每个元素的示例:

for(Map.Entry<K, V> e : map.entrySet())
{
    System.out.println(e.getKey()+": "+e.getValue());
}

2

您最好使用这个:

for (String key : LableList.keys()) {
    Label value = LableList.get(key);

    // do what you wish with key and value here
}

然而,在Java中,最好不要像在.NET中那样使用Dictionary,而是使用其中一个Map子类,例如HashMap。您可以通过以下方式遍历其中一个:

for (Entry<String, Label> e : myMap.entrySet()) {
    // Do what you wish with e.getKey() and e.getValue()
}

我们建议您不要在官方javadoc中使用字典。


1
Dictionary.keys() 返回一个枚举,它没有实现 Iterable 接口,因此不能在 foreach 循环中使用。你的代码将无法编译。 - Philipp
所以,要么我的Eclipse编译器出了问题(显示错误),要么我们谈论的不是同一件事。(并不是字典有任何关系) - Philipp
你的Java版本是多少? - Fritz H
Java 1.6.0_45,默认兼容级别。也许你指的是.keySet()而不是.keys()?当集合也实现Map时才实现.keySet(Dictionary没有,但Properties有)。 - Philipp

1

我正在尝试将一个HashMap(a)的内容添加到另一个HashMap(b)中。

我发现可以通过以下方式简单地遍历HashMap a:

a.forEach((k, v) -> b.put(k, v));

你可以修改我的示例来完成"->"另一侧的任何操作。
请注意,这是一个Lambda表达式,您需要使用Java 1.8(Java 8)或更高版本才能使其工作。 :-)

0

对于那些想知道如何在无法使用 Map 的情况下迭代字典的人,例如在 Java 中使用 SeviceReferences:

Java 8+

  dict.keys().asIterator().forEachRemaining((key -> {
         value = dict.get(key);

         //your code here using the key/value pair.
  });

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