有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带索引参数的链表java迭代器

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

public Iterator<E>iterator(int index)???  

谢谢! 普通迭代器:

    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 */ }
    }

共 (2) 个答案

  1. # 1 楼答案

    你可以直接调用普通的iterator()方法,然后多次调用next()

    public Iterator<E> iterator(int index) {
        Iterator<E> iterator = iterator();
        for (int i = 0; i < index && iterator.hasNext(); i++) {
            iterator.next();
        }
        return iterator;
    }
    
  2. # 2 楼答案

    这是如何实现这种iterator的开始示例,但也建议创建或扩展适当的interface,并使此对象实现此interface作为约定

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

    更新

    根据评论,我为LinkedList写了一个迭代器

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

    因为IteratorAnonymous class的对象,所以我们不能使用constructor,但可以在初始化块中初始化它。看看这个答案:https://stackoverflow.com/a/362463/947111我们在开始时遍历它一次(很抱歉C风格),所以它将指向currentObject。所有代码都是自我解释的