如何定制迭代器可以遍历列表哪个元素也是一个列表,例如{{1,2,3},{4,5,6}},这个自定义迭代器可以输出{1,2,3, 4,5,6}
class CustomIterator<E> implements Iterator<E>{
public CustomIterator(Iterator<Iterator<E>> root){
//add implement code...
}
//add implement code...
}
答案 0 :(得分:1)
我在这个问题上花了很多时间,最后我弄明白了,下面是完整的实现和测试代码,谢谢@ AlexHall的大力帮助。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
class IteratorFlattener<E> implements Iterator<E> {
private Iterator<Iterator<E>> root;
private Iterator<E> sub;
public IteratorFlattener(Iterator<Iterator<E>> root) {
this.root = root;
if(root.hasNext()){
this.sub = root.next();
}
}
@Override
public boolean hasNext(){
if(sub != null){
if(sub.hasNext()){
return true;
}
if(root.hasNext()){
sub = root.next();
return sub.hasNext();
}
}
return false;
}
@Override
public E next(){
if(sub == null){
throw new NoSuchElementException("root iterator was empty");
}
return sub.next();
}
@Override
public void remove(){
if(sub == null){
throw new NoSuchElementException("root iterator was empty");
}
sub.remove();
}
public static void main(String[] args){
System.out.println("start to test traverse");
List<Integer> l1 = new ArrayList<>();
l1.add(1);
List<Integer> l2 = new ArrayList<>();
l2.add(2);
l2.add(3);
List<Integer> l3 = new ArrayList<>();
l3.add(4);
l3.add(5);
l3.add(6);
List<Iterator<Integer>> root = new ArrayList<>();
root.add(l1.iterator());
root.add(l2.iterator());
root.add(l3.iterator());
IteratorFlattener it = new IteratorFlattener<>(root.iterator());
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("start to test remove method");
l1 = new ArrayList<>();
l1.add(1);
l2 = new ArrayList<>();
l2.add(2);
l2.add(3);
l3 = new ArrayList<>();
l3.add(4);
l3.add(5);
l3.add(6);
root = new ArrayList<>();
root.add(l1.iterator());
root.add(l2.iterator());
root.add(l3.iterator());
int i = 0;
it = new IteratorFlattener<>(root.iterator());
while(it.hasNext() && i < 3){
it.next();
it.remove();
i++;
}
while(it.hasNext()){
System.out.println(it.next());
}
}
}
答案 1 :(得分:0)
这不是一个答案,而是一个不符合令人遗憾的有限评论格式的扩展评论。
这是一个构建Iterator<Iterator<Integer>>
的小程序。您可以使用此类操作为CustomIterator构建测试用例。您的类将获得的所有内容都是testIterator引用,从中它应该能够遍历原始Integer数组的内容。
(我把&#34; public&#34;关闭了CustomIterator,所以我可以用我的main方法将它放在一个文件中。你不会这样做。)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] main) {
Iterator<Integer> i1 = Arrays.asList(new Integer[]{1}).iterator();
Iterator<Integer> i2 = Arrays.asList(new Integer[]{2,3}).iterator();
Iterator<Integer> i3 = Arrays.asList(new Integer[]{4,5,6}).iterator();
List<Iterator<Integer>> allIterators = new ArrayList<>();
allIterators.add(i1);
allIterators.add(i2);
allIterators.add(i3);
Iterator<Iterator<Integer>> testIterator = allIterators.iterator();
Iterator<Integer> myIterator = new CustomIterator<>(testIterator);
while(myIterator.hasNext()){
System.out.println(myIterator.next());
}
}
}
class CustomIterator<E> implements Iterator<E>{
public CustomIterator(Iterator<Iterator<E>> root){
//add implement code...
}
//add implement code...
}