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(); 而不是ObjectalleAntwoorden 应该是 List&lt;Map&lt;String, Boolean&gt;&gt; 类型。 antwoorden1antwoorden2alleAntwoorden 是如何定义的? 能否提供详细的错误信息? 在这种情况下,我不确定 HashMap 是否实用。存储包含字符串和布尔值的 4 个答案的 ArrayList 可能更合适。 @user3704388 你能说一下,为什么要迭代所有答案?我觉得你的设计可能有问题,List&lt;Map&lt;String,Boolean&gt;&gt; 不方便。可以考虑 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 和 ArrayList alleAntwoorden 我没有听说过钻石运算符,但我只是搜索了一下——今天早上给了我一些读物。谢谢。 @ThisClark 如果您正在使用 Java 6 进行编程,那么您不太可能见过它。它是 Java 7 的一部分。它使 SO 的代码保持整洁。 您可以通过遍历 entrySet() 来避免额外的查找。或者在 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&lt;String, Boolean&gt;。这不起作用,因为您当前的地图是HashMap&lt;Object, Object&gt; 类型。将变量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的主要内容,如果未能解决你的问题,请参考以下文章

java 中如何遍历hashMap的key所对应的value?

面试集锦

在 Java 中遍历 HashMap 的5种最佳方式

Java HashMap遍历实践

Java HashMap 如何正确遍历并删除元素

Java HashMap 遍历方式探讨