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

Can I use listiterator in Java to access elements in random positions?

我正在编写遍历文章记录(在数据库中)的代码。我将数据库加载到内存中并将其存储在 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] 吗?

// How to access litr[3]?

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

来自 ListIterator docs

A ListIterator has no current element; its cursor position always lies between the element that would be returned by a call to previous() and the element that would be returned by a call to next().

// How to access litr[3]?

我可以通过直接从列表中获取它来看到这里的可能性li.get(3);

如果你手头没有list,只有迭代器,先准备一个list

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)

你可以直接这样使用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
}

你的列表实例是一个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));
    }
}

ListIterator 中没有这样的功能。 ListIterator允许向前和向后迭代。

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