【问题标题】:Extracting elements of an ArrayList<String> as part of a Hashmap提取 ArrayList<String> 的元素作为 Hashmap 的一部分
【发布时间】:2019-03-03 05:16:40
【问题描述】:

我有以下代码:

for (Map.Entry < Integer, ArrayList < String >> entry: data.entrySet()) {
    Integer key = entry.getKey();
    ArrayList < String > value = entry.getValue();
    for (String aString: value) {
        System.out.println("key : " + key + " value : " + aString);
    }
}

Hashmap 被声明为

Map<Integer, List<String>> data = new HashMap<>();

在通过循环和put 方法填充之前。

我现在需要迭代 ArrayList 或更好的字符串,通过索引检索特定元素 .. 进行操作。我已经尽我所能进行了研究,似乎已经找到了答案,上面的代码。它是从一段时间前此处给出的答案中复制而来的。

但是,当我尝试使用它时,会抱怨“不兼容的类型”,顶行用红色下划线直到冒号。

  • 必填:Entry &lt;Integer,java.util.List&lt;java.lang.String&gt;&gt;
  • 找到:Entry &lt;Integer,java.util.ArrayList&lt;java.lang.String&gt;&gt;

【问题讨论】:

  • 将您的条目从Entry&lt;Integer, ArrayList&lt;String&gt; 更改为Entry&lt;Integer, List&lt;String&gt;,以及将此ArrayList&lt;String&gt; value = entry.getValue(); 更改为List&lt;String&gt;...

标签: java list dictionary arraylist hashmap


【解决方案1】:

因为您在Hashmap 中将值类型声明为List&lt;String&gt;,并且您在for loop 中将ArrayList&lt;String&gt; 作为值类型Map.Entry

更改 Map&lt;Integer, List&lt;String&gt;&gt; data = new HashMap&lt;&gt;();Map&lt;Integer, ArrayList&lt;String&gt;&gt; data = new HashMap&lt;&gt;();

【讨论】:

  • 虽然这样可以解决问题,但对于以后的读者,不建议这样做。尽可能使用抽象,在这种情况下使用接口 List 而不是实现 ArrayList。这是 SOLID 原则之一。
  • @CrazySabbath 我同意。
【解决方案2】:

试试下面的代码:

for (Map.Entry<Integer, List<String>> entry : data.entrySet()) {
       Integer key = entry.getKey();
       List<String> value = entry.getValue();
       for(String aString : value){
            System.out.println("key : " + key + " value : " + aString);
            }

【讨论】:

    【解决方案3】:

    在您的情况下,您有List 接口和ArrayList 实现,您在地图的声明中正确使用了List 类型,但是您传递给在循环。

    问题出现是因为以下语句:

    Map<Integer, List<String>> data = new HashMap<>();
    

    空菱形表示法为List&lt;String&gt; 的实现留下了许多选择。它可以是 ArrayList、LinkedList 等。所以你不能确定编译器会使用ArrayList 实现。

    为了支持代码可扩展性,建议执行所谓的针对接口编程。尽可能保持最通用的类​​型总是好的,以避免将代码耦合到特定的实现,也就是说,当您需要对其执行一些具体操作时,您将指定实现。

    【讨论】:

    • 谢谢大家!!这一切都是新的,所以它有点曲线! ...但是,这可能是我众所周知的“家庭失明”的情况,因为在我看来,我使用 ArrayList 定义了 HashMap ...但直到有人指出我有 List 没有我的愿景专注于页面上的真正内容! .. 叹息
    【解决方案4】:

    针对接口而不是针对实现进行编程。

    Map 的类型是Integer 作为键,List&lt;String&gt; 作为值。因此,您只能循环使用相同结构的条目。

    for (Map.Entry < Integer, List < String >> entry: data.entrySet()) {
        Integer key = entry.getKey();
        List <String> value = entry.getValue();
        for (String aString: value) {
            System.out.println("key : " + key + " value : " + aString);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 2014-04-28
      • 2014-01-13
      • 2013-10-05
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多