Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带索引参数的java迭代器_Java_Linked List_Iterator - Fatal编程技术网

带索引参数的java迭代器

带索引参数的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

hi LinkedList的普通迭代器如下所示,但是,我们如何构建一个迭代器来返回从指定索引开始的迭代器?我们如何建立:

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;
    }