【问题标题】:Java - Iteration over HashMap replacing ArrayListJava - 对 HashMap 的迭代替换 ArrayList
【发布时间】:2012-03-07 05:17:33
【问题描述】:

之前我设置了一个 ArrayList 来包含记录对象。此后,我将 ArrayList 替换为存储对象的 HashMap,并使用个人的用户名字符串作为键。

该目录的类通过implements Iterable<Object> 实现了Iterable(只是一个题外话,但为什么需要<Object>?)。

之前用于遍历 ArrayList 的代码是:

    public Iterator iterator() {
        return records.iterator();
    }

然后我将该迭代器用于该类中的所有对象,如下所示:

   for (Object o : directory) { 
            TelephoneRecords temp = (TelephoneRecords) o;
            System.out.println(temp.toString());
    }

不幸的是,HashMapName.iterable();似乎引发了问题,那么我该如何使用 HashMap 来处理这种行为?

【问题讨论】:

    标签: java map arraylist hashmap


    【解决方案1】:

    如果你只对key感兴趣,可以遍历map的keySet():

    Map<String, Object> map = ...;
    
    for (String key : map.keySet()) {
        // ...
    }
    

    如果你只需要值,使用 values():

    for (Object value : map.values()) {
        // ...
    }
    

    最后,如果你想要key和value,使用entrySet():

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

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

      您可以遍历 HashMap 的 entrySet。 entrySet 包含键和值的集合。然后可以通过 getKey() 和 getValue() 访问键和值。这可以通过以下代码完成:

      for (Map.Entry<String, Object> entry : map.entrySet()) {
          String username = entry.getKey();
          TelephoneRecord record = (TelephoneRecord)entry.getValue();
          // Do something with username and record ...
      }
      

      你的问题:

      Object 是 HashMap 的类型参数,表示 Iterable 包含 Objects。如果您的 HashMap 只应该包含 TelephoneRecords 对象,请替换

      implements Iterable<Object>
      

      implements Iterable<TelephoneRecords>
      

      这样你就说你的 Iterable 包含 TelephoneRecords,如果你做错了什么(这是首选!),这反过来可以让你避免强制转换并得到编译错误而不是运行时错误。这会将上述代码改进为:

      for (Map.Entry<String, TelephoneRecord> entry : map.entrySet()) {
          String username = entry.getKey();
          TelephoneRecord record = entry.getValue();
          // Do something with username and record ...
      }
      

      【讨论】:

      • 那么为什么我的 records.iterator() 有问题; ?
      • 不能直接遍历HashMap,必须使用entrySet。所以如果你想创建一个迭代器试试: Iterator> mapEntries = records.entrySet().iterator();
      【解决方案3】:

      “似乎引发问题”是什么意思?在 HashMap 中,您可以迭代键 (map.keySet())、值 (map.values()) 或键值对 (map.entrySet())。

      【讨论】:

        【解决方案4】:

        我用records.values().iterator(); 替换records.iterator();(不起作用)解决了我的问题。您似乎无法直接遍历 HashMap,但可以遍历其中的值(对象)。

        另外,获取和打印HashMap内容的问题,我通过下面的代码解决了。它遍历目录中的 TelephoneRecords 对象,由 TelephoneRecords o : directory 和目录类中的 Iterator 方法指定。然后将一个临时对象分配给被迭代的 TelephoneRecords 对象,并使用 [custom] toString() 方法打印出该特定 TelephoneRecords 对象的字符串。

        for (TelephoneRecords o : directory) { 
            TelephoneRecords temp = (TelephoneRecords) o;
            System.out.println(temp.toString());
        }
        

        我最终通过提供的帮助解决了我的小问题,使用Iterator&lt;TelephoneRecords&gt;(而不是简单地使用对象)迭代目录对象中包含的 TelephoneRecords 对象。

        【讨论】:

          【解决方案5】:

          您可以使用哈希图中的条目集,然后以与您已经使用的方式相同的方式对其进行迭代,例如

          for (Object o : Directory.getEntrySet()) {
          

          }

          另外,如果你输入你的 hashmap,它将消除对演员表的需要 -

          Map<String, TelephoneRecords>
          

          【讨论】:

            猜你喜欢
            • 2016-09-08
            • 2015-02-12
            • 1970-01-01
            • 2012-06-15
            • 2011-12-02
            • 2015-01-20
            • 2017-11-01
            • 2015-09-19
            • 2011-03-21
            相关资源
            最近更新 更多