Java - 通过HashMap替换ArrayList的迭代

时间:2012-02-15 20:12:03

标签: java map arraylist hashmap

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

此目录的类通过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来解决这个问题呢?

5 个答案:

答案 0 :(得分:5)

如果您只对键感兴趣,可以遍历地图的keySet():

Map<String, Object> map = ...;

for (String key : map.keySet()) {
    // ...
}

如果您只需要值,请使用值():

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

最后,如果你想要键和值,请使用entrySet():

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

希望这会对你有所帮助。

答案 1 :(得分:1)

您可以遍历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 ...
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以使用hashmap中的entryset,然后以与您已经相同的方式迭代它。

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

}

此外,如果您键入您的hashmap,它将不再需要强制转换 -

Map<String, TelephoneRecords>

答案 4 :(得分:0)

我用records.iterator();替换records.values().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<TelephoneRecords>(而不是简单地使用Object)迭代目录对象中包含的TelephoneRecords对象。