Java 用 HashMap 遍历 ArrayList
Posted
技术标签:
【中文标题】Java 用 HashMap 遍历 ArrayList【英文标题】:Java iterate over ArrayList with HashMap in it 【发布时间】:2015-02-13 15:39:17 【问题描述】:我有一个包含四个答案的 Hashmap。我有前 2 个问题。我就是这样做的
// Awnsers question 1
antwoorden1.put("Hypertext Preprocessor", true);
antwoorden1.put("Hypertext phpprocessor", false);
antwoorden1.put("Hypertext processor", false);
antwoorden1.put("Preprocessor PHP", false);
// Awnsers question 2
antwoorden2.put("Model view config", false);
antwoorden2.put("Model view connect", false);
antwoorden2.put("Model view controllers", false);
antwoorden2.put("Model view controller", true);
现在我需要访问所有这些信息,所以我要做的就是将两个 HashMap 添加到一个 ArrayList
// Add the Hashmaps to the arrayList
alleAntwoorden.add(antwoorden1);
alleAntwoorden.add(antwoorden2);
但是如何循环遍历 ArrayList 以从 HashMap 中获取键和值?这是我已经尝试过的。
for(int i = 0; i < alleAntwoorden.size(); i++)
for (Map.Entry<String, Boolean> entry : alleAntwoorden.get(i).entrySet())
String key = entry.getKey();
Object value = entry.getValue();
// ...
但我总是收到以下消息:不兼容的类型
Antwoorden1、anttwoorden2 和 alleAntwoorden 定义为:
private ArrayList<HashMap> alleAntwoorden;
private HashMap<String, Boolean> antwoorden1, antwoorden2;
【问题讨论】:
boolean value = entry.getValue();
而不是Object
。 alleAntwoorden
应该是 List<Map<String, Boolean>>
类型。
antwoorden1
、antwoorden2
和 alleAntwoorden
是如何定义的?
能否提供详细的错误信息?
在这种情况下,我不确定 HashMap 是否实用。存储包含字符串和布尔值的 4 个答案的 ArrayList 可能更合适。
@user3704388 你能说一下,为什么要迭代所有答案?我觉得你的设计可能有问题,List<Map<String,Boolean>>
不方便。可以考虑 Compass 的Answer
Type 方法。
【参考方案1】:
在以下界面上:
Map<String, Boolean> map1 = new HashMap<>();
Map<String, Boolean> map2 = new HashMap<>();
List<Map<String, Boolean>> list = new ArrayList<>();
我们可以使用 foreach 循环进行迭代:
for (Map<String, Boolean> entry : list)
for (String key : entry.keySet())
Boolean value = entry.get(key);
System.out.println("key = " + key);
System.out.println("value = " + value);
【讨论】:
嗨,这可能很好地解决了这个问题......但如果你能提供一些关于它如何工作以及为什么工作的解释会很好:) 不要忘记 - 有很多新手在 Stack Overflow 上,他们可以从你的专业知识中学到一两件事——对你来说显而易见的事情对他们来说可能并不那么明显。还有……你听说过钻石操作员吗?使用它可以大大缩短您的通用声明 这几乎可以肯定是 OP 需要的答案,但@Vogel612 是正确的 - 它将受益于您在 Arraylist 中指定通用 Hashmap 类型的解释,即 ArrayList> alleAntwoorden 和 ArrayListentrySet()
来避免额外的查找。或者在 Java 8 中,您可以使用更干净的 forEach()
。【参考方案2】:
一切都应符合以下定义:
Map<String, Boolean> antwoorden1 = new HashMap<>();
Map<String, Boolean> antwoorden2 = new HashMap<>();
List <Map<String, Boolean>> alleAntwoorden = new ArrayList<>();
【讨论】:
嗨,这可能很好地解决了这个问题......但如果你能提供一些关于它如何工作以及为什么工作的解释会很好:) 不要忘记 - 有很多新手在 Stack Overflow 上,他们可以从你的专业知识中学到一两件事——对你来说显而易见的事情对他们来说可能并不那么明显。 这可以成为了解更多信息的起点——如果您选择这样做的话。如果一个人只对复制粘贴感兴趣,那么再多的解释也无济于事 ***(以及整个 SE 网络)并不是要帮助那些只想让他的代码正常工作的用户......它适用于所有其他有同样问题并找到 SO 问题的用户在谷歌上。不要为复制粘贴写你的答案,但对于来自谷歌的人,需要一些解释。 你正在编造这个:“Stack Overflow 是一个面向专业和***程序员的问答网站。” 以及 “好的答案被投票和上升到顶部。”。你的反对票只是噪音。 是吗?我认为您的答案不是一个好的答案,因此投了反对票。随时在Meta Stack Overflow 提出这个问题,或者在Stack Overflow Chat(Java 室)与我讨论这个问题。【参考方案3】:正如其他用户所说,有更好的方法来完成这种任务,但如果你想使用你的方法,这是一个功能代码 sn-p:
HashMap antwoorden1 = new HashMap();
HashMap antwoorden2 = new HashMap();
// Awnsers question 1
antwoorden1.put("Hypertext Preprocessor", true);
antwoorden1.put("Hypertext PHPprocessor", false);
antwoorden1.put("Hypertext processor", false);
antwoorden1.put("Preprocessor PHP", false);
// Awnsers question 2
antwoorden2.put("Model view config", false);
antwoorden2.put("Model view connect", false);
antwoorden2.put("Model view controllers", false);
antwoorden2.put("Model view controller", true);
ArrayList<HashMap> alleAntwoorden = new ArrayList<HashMap>();
// Add the Hashmaps to the arrayList
alleAntwoorden.add(antwoorden1);
alleAntwoorden.add(antwoorden2);
for(int i = 0; i < alleAntwoorden.size(); i++)
Iterator it = (Iterator)alleAntwoorden.get(i).entrySet().iterator();
while (it.hasNext())
Map.Entry pairs = (Map.Entry)it.next();
System.out.println(pairs.getKey() + " = " + pairs.getValue());
it.remove(); // avoids a ConcurrentModificationException
【讨论】:
嗨,这可能很好地解决了这个问题......但如果你能提供一些关于它如何工作以及为什么工作的解释会很好:) 不要忘记 - 有很多新手在 Stack Overflow 上,他们可以从你的专业知识中学到一两件事——对你来说显而易见的事情对他们来说可能并不那么明显。 原始类型永远不是更好的方法。 是的,我理解你的 cmets,正如我所说,有更好的方法,但如果 OP 试图以这种方式解决...... @razcor 只是因为 op 想朝自己的腿开枪,所以您不必将枪对准他的胯部;)相反,您也可以提出更好的方法【参考方案4】:来自评论:
private ArrayList<HashMap> alleAntwoorden;
这就是问题所在。您正在使用原始类型映射,但您尝试将单个条目分配给变量Map.Entry<String, Boolean>
。这不起作用,因为您当前的地图是HashMap<Object, Object>
类型。将变量alleAntwoorden
更改为:
private List<Map<String, Boolean>> alleAntwoorden;
请注意,我还将类型更改为它们的接口类型:Should you always Code To Interfaces In Java。
【讨论】:
这个答案描述了为什么它因为原始类型而失败。 +1【参考方案5】:如果你使用的是 Eclipse,你可以写entry.getValue()
。将光标放在它上面并使用键盘快捷键 Ctrl+2, l,它会自动解析正确的类型。
对于 IntelliJ,它的工作原理几乎相同,但使用 Ctrl+Alt+v
【讨论】:
以上是关于Java 用 HashMap 遍历 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章