Java遍历包含HashMap的ArrayList

16

我有一个包含四个答案的哈希表。我有两个问题,这是我的解决方法。

    // 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,antwoorden2和alleAntwoorden被定义为:

private ArrayList<HashMap> alleAntwoorden; 
private HashMap<String, Boolean> antwoorden1, antwoorden2;

5
布尔值应为entry.getValue(),而不是Object。"alleAntwoorden"应该是List<Map<String, Boolean>>类型。 - Tom
3
antwoorden1antwoorden2alleAntwoorden是如何定义的? - Predrag Maric
你能提供详细的错误信息吗? - MD Sayem Ahmed
在这种情况下,我不确定HashMap如何实用。存储4个包含字符串和布尔值的答案的ArrayList可能更合适。 - Compass
1
@user3704388,你能说一下为什么要遍历所有答案吗?我感觉你的设计可能有问题,List<Map<String,Boolean>> 不太方便。你可以考虑使用Compass的 Answer 类型方法。 - Kent
显示剩余5条评论
5个回答

21

来自评论:

private ArrayList<HashMap> alleAntwoorden;

这是问题所在。您正在使用一种原始类型的 map,但您正在尝试将单个条目赋给变量 Map.Entry<String, Boolean>。这是行不通的,因为您当前的 map 类型是 HashMap<Object, Object>。请将变量 alleAntwoorden 更改为:

private List<Map<String, Boolean>> alleAntwoorden;

请注意,我还将类型更改为它们的接口类型:Java中是否应始终使用接口编写代码


这个答案解释了为什么由于原始类型而失败。+1 - rgettman

16

在以下界面上:

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);
    }
}

1
嗨,这可能解决问题......但如果您能提供一些关于它是如何工作以及为什么要这样做的解释就更好了 :) 别忘了 - 在 Stack Overflow 上有许多新手,他们可以从您的专业知识中学到一些东西 - 对您来说很明显的东西对他们来说可能不是那么明显。另外......你听说过 Diamond Operator 吗?你的泛型声明可以大大缩短。 - Vogel612
这几乎肯定是OP需要的答案,但@Vogel612是正确的 - 它会受益于一个解释,即您正在为Arraylist中的通用Hashmap指定类型,即ArrayList<HashMap<String,Boolean>> alleAntwoorden和ArrayList<HashMap> alleAntwoorden之间的区别。 - J Richard Snape
我之前没听说过钻石操作符,但是我刚刚搜索了一下——这让我有了今天早上的阅读内容。谢谢。 - ThisClark
1
@ThisClark 如果你正在使用Java 6进行编程,那么你很可能没有看到它。它是从Java 7开始的。它可以使代码更整洁,适用于SO。 - Compass
你可以通过迭代entrySet()来避免额外的查找。或者在Java 8中,你可以使用更加简洁的forEach()方法。 - shmosel

0

一切都应该与以下定义一起工作:

Map<String, Boolean> antwoorden1 = new HashMap<>();
Map<String, Boolean> antwoorden2 = new HashMap<>();
List <Map<String, Boolean>> alleAntwoorden = new ArrayList<>();

2
嗨,这可能会解决问题...但如果您能提供一些关于它如何以及为什么起作用的解释,那就太好了 :) 别忘了 - 在 Stack Overflow 上有很多新手,他们可以从您的专业知识中学到一些东西 - 对您来说显而易见的可能对他们来说并非如此。 - Vogel612
这可以作为学习更多的起点 - 如果有人选择这样做的话。如果只对复制粘贴感兴趣,那么任何解释都无济于事。 - David Soroko
1
Stackoverflow(以及整个SE网络)并不是关于帮助那些只想让他们的代码正常工作的用户...它是为所有遇到相同问题并在Google上找到SO问题的其他人所提供的。不要为了复制和粘贴而编写答案,而是要为从Google来寻求一些解释的人编写答案。 - Vogel612
你是在编造: “Stack Overflow 是一个面向专业和爱好者程序员的问答网站。” 以及 “好的答案会被投票并上升到顶部。” 你的负评只是噪音。 - David Soroko
1
这是吗?我认为你的回答不够好,因此被投了反对票。欢迎在[元]上提出这个问题或在[聊天室](Java房间)与我讨论。 - Vogel612
当然,您有权像其他人一样点击向下按钮。 - David Soroko

0
如果您正在使用Eclipse,您只需编写entry.getValue()。将光标放在其上方,然后使用键盘快捷键Ctrl+2,l,它会自动解析正确的类型。
对于IntelliJ,它几乎相同,但使用Ctrl+Alt+v。

-1

正如其他用户所述,有更好的方法来完成这种任务,但如果您想使用自己的方法,这是一个可行的代码片段:

    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 上有很多新手,他们可以从您的专业知识中学到一些东西 - 对您来说显而易见的可能对他们来说并非如此。 - Vogel612
2
原始类型永远不是更好的选择。 - Tom
是的,我理解你的评论了。就像我说的,有更好的方法,但如果OP想用这种方式解决问题... - razcor
3
@razcor只是因为OP想朝自己的腿开枪,并不意味着你必须瞄准他的裆部;相反,你可以建议更好的方法。 - Vogel612

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