我可以在Java中使用listiterator来访问随机位置的元素吗?

时间:2015-07-29 09:46:50

标签: java listiterator

我正在编写遍历文章记录的代码(在数据库中)。我在内存中加载数据库并将其存储在ListIterator

有没有人知道我是否可以访问随机位置的元素?

我创建了这个Java示例:

package com.myjava.listiterator;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class MyListIterator {
    public static void main(String a[]){
        List<Integer> li = new ArrayList<Integer>();
        ListIterator<Integer> litr = null;
        li.add(23);
        li.add(98);
        li.add(29);
        li.add(71);
        li.add(5);
        litr=li.listIterator();
        System.out.println("Elements in forward directiton");
        while(litr.hasNext()){
            System.out.println(litr.next());
        }
        System.out.println("Elements in backward directiton");
        while(litr.hasPrevious()){
            System.out.println(litr.previous());
        }

        // How to access litr[3]?
    }
}

此代码向前和向后循环播放数字。看我上次的评论。我可以访问litr[3]吗?

4 个答案:

答案 0 :(得分:4)

  

//如何访问litr [3]?

不,你无法从迭代器中随机获取。

来自ListIterator docs

  

ListIterator没有当前元素;它的光标位置总是位于调用previous()返回的元素和调用next()返回的元素之间。

// How to access litr[3]?

我可以通过直接从列表中li.get(3);

来看到这种可能性

如果您手头没有列表且只有迭代器,请先准备一份清单

List<ObjectType> dupList= new ArrayList<ObjectType>();
while (itr.hasNext())
    dupList.add(itr.next());

替代方法,如果你只需要一个对象:

ObjectType target =null;
int i = 0;
while(itr.hasNext() && i!=3){
    i++;
    target = itr.next();
}
//access fourth element via target variable.

现在将随机索引传递给此列表(dupList)

答案 1 :(得分:2)

您的列表实例是ArryaList,只需直接使用它即可。

package com.myjava.listiterator;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class MyListIterator {
    public static void main(String a[]){
        ArrayList<Integer> li = new ArrayList<Integer>();
        li.add(23);
        li.add(98);
        li.add(29);
        li.add(71);
        li.add(5);

        ....

        // How to access litr[3]?
        System.out.println(li.get(3));
    }
}

如果您的方法只接受ListIterator而无法修改。 如果您不关心性能,这是一个解决方案。

package com.myjava.listiterator;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class MyListIterator {

    public void someMethodOnlyAcceptListIterator(ListIterator<Integer> iterator){
        List<Integer> tmpList = new ArrayList<Integer>();

        // Save all items to the tmpList
        while(iterator.hasNext()){
            tmpList.add(litr.next());
        }

        // Access item
        System.out.println(tmpList.get(3));
    }
}

答案 2 :(得分:1)

您可以像li.get(3)

一样直接使用

你也可以这样做但不好。

while(litr.hasNext()){
    int curentIndex = litr.nextIndex()-1;
    if(ranIndex > currentIndex) {
         while(litr.hasNext()){
            if(ranIndex  == litr.nextIndex()-1)
               sysout(yourrandomindex);
               after that reset back the list curentIndex 
        }

    }
    // less than code here
}

答案 3 :(得分:1)

ListIterator中没有此类功能。 ListIterator允许前向和后向迭代。

至于获取litr[3]的解决方案,您可以使用ListIterator并将其所有元素应用到ArrayList并执行list.get(3)