java 带索引参数的迭代器
java iterator with index parameter
嗨,LinkedList 的普通迭代器如下所示,但是,我们如何构建一个迭代器,returns 一个从指定索引开始的迭代器?我们如何构建:
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 */ }
}
好吧,你可以调用普通的 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;
}
这是如何实现此类 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;
}
因为Iterator
是Anonymous class
的对象我们不能使用constructor
但是可以在初始化块中初始化它看这个答案:我们遍历它一次在开头 (对不起 C 风格) 所以它将指向 currentObject
。所有剩余代码都是自我解释的。
嗨,LinkedList 的普通迭代器如下所示,但是,我们如何构建一个迭代器,returns 一个从指定索引开始的迭代器?我们如何构建:
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 */ }
}
好吧,你可以调用普通的 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;
}
这是如何实现此类 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;
}
因为Iterator
是Anonymous class
的对象我们不能使用constructor
但是可以在初始化块中初始化它看这个答案:我们遍历它一次在开头 (对不起 C 风格) 所以它将指向 currentObject
。所有剩余代码都是自我解释的。