Java - 列表迭代器不适用于IdentityHashMap

时间:2017-11-19 21:48:30

标签: java iterator

我正在使用身份哈希映射来跟踪我之前在自定义序列化程序中看到的对象。我有一个while循环,我尝试迭代地图中的条目。在方法调用addAllFields期间,可能会将对象添加到地图的键集中。经过一些调试后,我注意到我的iterator.hasNext()返回false,即使我知道自上次循环体执行以来对象已添加到地图中。我在这里做错了什么?

public Document serialize(Object obj) throws Exception {
    reset();
    addToMap(obj);
    Set<Object> keys = map.keySet();
    Iterator<Object> iterator = keys.iterator();
    while(iterator.hasNext()) {
        Object key = iterator.next();
        Element objectElement = createObjectElement(key.getClass().getName(), map.get(key));
        addAllFields(objectElement, key);
        document.getRootElement().addContent(objectElement);
    }
    return document;
}

1 个答案:

答案 0 :(得分:0)

你需要使用ListIterator,然后如果你想迭代添加的元素,你需要反过来做整件事:

ListIterator<Object> iter = keys.listIterator(keys.size());
while (iter.hasPrevious()){
    Object prev=iter.previous();
    // do your Element creation here
    // then use the iter.add() method
    iter.add(/*new object*/);
}

注意,您可能需要将keyset包装在不同的集合类型中,因为并非所有支持ListIterator,并且可能需要将iter作为参数传递给#addAllFields() 您可能还需要迭代条目集而不是keySet