迭代器有.next() - 有没有办法获取前一个元素而不是下一个元素?

时间:2010-05-05 11:47:03

标签: java collections iterator

我有一个在HashMap上使用的迭代器,我保存并加载迭代器。 有没有办法用Iterator获取HashMap中的上一个键? (java.util.Iterator的)

更新

我将它保存为Red5连接中的属性,然后将其加载以继续工作,直到我停止。

另一次更新

我正在遍历HashMap的键集

10 个答案:

答案 0 :(得分:28)

您可以使用ListIterator代替Iterator。 ListIterator具有previous()hasPrevious()方法。

答案 1 :(得分:14)

不像其他人指出的那样直接,但如果你是需要访问前一个元素,您可以轻松地将其保存在单独的变量中。

T previous = null;
for (Iterator<T> i = map.keySet().iterator(); i.hasNext();) {
    T element = i.next();

    // Do something with "element" and "previous" (if not null)

    previous = element;
}

答案 2 :(得分:14)

听起来您希望数组语义更类似于ListIterator,而不是Iterator接口提供的语义。获取此类内容的最简单方法是构建一个列表(来自键集(LinkedList<K> keyList = new LinkedList<K>(map.keySet())),然后手动使用ListIterator而不是常规Iterator或foreach。

对于需要记住连续项的非常简单的情况,处理此问题的最简单方法是将前一个Key存储在局部变量中,并在循环结束时更新它。

答案 3 :(得分:3)

不,Iterator<E>只定义了3种方法:

boolean hasNext()
E next()
void remove() 

您当然可以实现自己的迭代器。

答案 4 :(得分:1)

正如其他人所说,您只能使用next()访问元素。然而,它的是一个术语问题。致电next()后, 当前元素。

除非问题是你需要在每次迭代中看到集合中的两个连续项,在这种情况下,一个简单的变量看起来最简单。

答案 5 :(得分:1)

虽然Set没有为反向迭代器提供方法,但Deque确实如此。对于反向顺序中的迭代器和descendingIterator(),可以使用iterator()作为转发顺序中的迭代器。

(您可以Deque通过Set创建Deque<T> deque = new LinkedList<T>(set),其中set是您的SetT通用类型'正在使用。)

答案 6 :(得分:1)

最终Iterator并不完全适合您的任务。

为什么不从List创建Set(例如,通过List list = new LinkedList(set))并使用标准的索引for循环进行迭代?这样您就知道前一个元素位于i - 1

答案 7 :(得分:0)

使用迭代器,不,你没有选项来获取以前的键值。它只有hasNext()和next()方法。

答案 8 :(得分:0)

不,你不能。 Iterator接口没有获取前一个元素的方法。

但你可以做的是 - 有点垃圾 - 创建一个List<Entry<Integer, YourObjectType>>,其中Integer - 值代表密钥对象的哈希码。然后你可以做这样的事情:

for (int i = 0; i < list.size(); i++)
{
    YourObjectType current = list.get(i).getValue();
    YourObjectType previous = (i == 0 ? null : list.get(i - 1).getValue());
    // Do whatever you want
}

我知道这很垃圾,但有可能

答案 9 :(得分:0)

制作自己的迭代器:

public class EnhancedIterator<E> implements Iterator<E>{
    private List<E> list;
    private int indexSelected=-1;
    public EnhancedIterator(List<E> list){
        this.list=list;
    }

    @Override
    public boolean hasNext() {
        return indexSelected<list.size()-1;
    }

    @Override
    public E next() {
        indexSelected++;
        return current();
    }

    @Override
    public void remove() {
        list.remove(indexSelected);
    }
    public void remove(int i){
        list.remove(i);
        if(i<indexSelected){
            indexSelected--;
        }
    }
    public E previous(){
        indexSelected--;
        return current();
    }
    public E current(){
        return list.get(indexSelected);
    }
    public E get(int i){
        return list.get(i);
    }
}