带索引参数的java迭代器
hi LinkedList的普通迭代器如下所示,但是,我们如何构建一个迭代器来返回从指定索引开始的迭代器?我们如何建立:带索引参数的java迭代器,java,linked-list,iterator,Java,Linked List,Iterator,hi LinkedList的普通迭代器如下所示,但是,我们如何构建一个迭代器来返回从指定索引开始的迭代器?我们如何建立: public Iterator<E>iterator(int index)??? 公共迭代器(int索引)??? 谢谢! 普通迭代器: public Iterator<E> iterator( ) { return new ListIterator(); } private class ListIter
public Iterator<E>iterator(int index)???
公共迭代器(int索引)???
谢谢!
普通迭代器:
public Iterator<E> iterator( )
{
return new ListIterator();
}
private class ListIterator implements Iterator<E>
{
private Node current;
public ListIterator()
{
current = head; // head in the enclosing list
}
public boolean hasNext()
{
return current != null;
}
public E next()
{
E ret = current.item;
current = current.next;
return ret;
}
public void remove() { /* omitted because optional */ }
}
公共迭代器迭代器()
{
返回新的ListIterator();
}
私有类ListIterator实现了迭代器
{
专用节点电流;
公共列表迭代器()
{
current=head;//封闭列表中的head
}
公共布尔hasNext()
{
返回电流!=null;
}
公共教育
{
E ret=当前项目;
当前=当前。下一步;
返回ret;
}
public void remove(){/*省略,因为可选*/}
}
您可以调用正常的迭代器()
方法,然后多次调用next()
:
public Iterator<E> iterator(int index) {
Iterator<E> iterator = iterator();
for (int i = 0; i < index && iterator.hasNext(); i++) {
iterator.next();
}
return iterator;
}
公共迭代器迭代器(int索引){
迭代器迭代器=迭代器();
for(int i=0;i
这是如何实现此类迭代器的开始示例,但也建议创建或扩展适当的接口
,并使此对象实现此接口
,以符合惯例
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IterableObject {
private List<String> values = new ArrayList<String>();
public Iterator<String> getIterator(final int index) {
Iterator<String> it = new Iterator<String>() {
private int current = index;
@Override
public void remove() {
// TODO Auto-generated method stub
}
@Override
public String next() {
String value = values.get(current);
current++;
return value;
}
@Override
public boolean hasNext() {
if(values.size() > current){
return true;
}else{
return false;
}
}
};
return it;
}
}
因为Iterator
是匿名类的对象
我们不能使用constructor
但可以在initialise块中初始化它看看这个答案:我们在开始时遍历它一次(很抱歉使用C样式),所以它将指向currentObject
。所有剩余的代码都是自我解释的。你不想使用传统的for
循环遍历集合,跳过你不感兴趣的索引吗?@ChetanKinger:我不确定你的意思-这不是我通常写的方法,但它回答了人们提出的问题……我将尝试通过代码进行详细说明:for(inti=0;iindex){break;}else{//dosomething}
。为什么首先要创建迭代器?唯一有意义的原因是,如果您计划在迭代时删除元素。@jonsket谢谢您,Jon!帮了大忙,你是个传奇人物!如果您不打算在迭代时从集合中删除元素,您只需要使用传统的for
循环。LinkedList有一个方法listIterator(int)
,它完全满足您的需要。这是@ChetanKinger,是的,我犯了个错误,已经修复了。谢谢你指点我。刚刚试用了你的代码,它的工作原理和广告一样。这比我接受的答案要好。@ChetanKinger,ups我不小心删除了你的评论:(对不起,这对于链表来说效率极低,因为values.get(index)
每次执行时都需要从头遍历列表以获取指定的元素。hasNext
方法可以更简洁地编写,其主体如下:返回值。get(current)!=null;
。
public Iterator<String> getIterator(final int index) {
Iterator<String> it = new Iterator<String>() {
private Object currentObject = null;
{
/*initialize block where we traverse linked list
that it will pointed to object at place index*/
System.out.println("initialize" + currentWord);
for(int i = 0; currentObject.next != null && i < index; i++, currentObject = currentObject.next)
;
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
@Override
public String next() {
Object obj = currentObject.next;
currentObject = currentObject.next;
return obj;
}
@Override
public boolean hasNext() {
return currentObject.next != null;
}
};
return it;
}