我想创建一个迭代器类,它允许我通过泛型类型的列表(例如lst1 integer,lst2 string)迭代一个项目。
为此我必须考虑以下给出的情况。
该接口是一个通用的迭代器。这部分代码不能修改。
interface Iterator {
E next ();
boolean hasNext();
}列表类也被定义如下。最重要的是,一个列表对象可以用方法getIterator()返回一个迭代器对象。这部分代码不能修改。
class List {
class ListNode {
T val;
ListNode next;
ListNode (T v) {
val = v; next = null;
}
}
ListNode head;
List (ListNode hd) { head = hd; }
List () { this(null); }
void prepend (T val) {
ListNode p = new ListNode(val);
p.next = head;
head = p;
}
//some other methods
class ListIterator implements Iterator {
ListNode pos;
ListIterator () {
pos = head;
}
public T next () {
T res = pos.val;
pos = pos.next;
return res;
}
public boolean hasNext () {
return pos != null;
}
}
Iterator getIterator () {
return this.new ListIterator();
}
}让我们假设这两个列表都具有相同的类型,现在它们也具有相同的长度。我试着用两个迭代器对象创建一个类,并使用迭代器对象的方法来实现接口迭代器。这部分代码是由我创建的,可以修改。
class ZipIterator implements Iterator
{
int counter;
Iterator first;
Iterator second;
ZipIterator (Iterator f, Iterator s)
{
first = f;
second = s;
counter = 0;
}
public T next ()
{
if (counter % 2 == 0)
{
counter++;
return first.next();
}
else
{
counter++;
return second.next();
}
}
public boolean hasNext ()
{
if (counter % 2 == 0)
return first.hasNext();
else
return second.hasNext();
}
}这适用于两个相同类型的列表。这里是我用于测试的代码和输出:
class IteratorUtils
{
public static void main (String[] args)
{
List lst1 = new List<>();
List lst2 = new List<>();
lst1.prepend(3);
lst1.prepend(2);
lst1.prepend(1);
lst2.prepend(8);
lst2.prepend(9);
lst2.prepend(10);
Iterator it1 = lst1.getIterator();
Iterator it2 = lst2.getIterator();
ZipIterator zit = new ZipIterator<>(it1, it2);
while (zit.hasNext())
{
System.out.println(zit.next());
}
}
}输出:
1
10
2
9
3
8现在我想以通用的方式实现ZipIterator,所以我可以使用两个不同类型的项目(例如整数和字符串)的列表。我知道我必须更改类ZipIterator,以便方法next()返回一个泛型类型,但我不知道如何。
这是我必须做的一项大学任务,教授留下了一条提示:“使用通配符:?扩展T,?超级T,?扩展对象”。但对于通配符,我只能指定继承方向的类型,对吗?这可能改变ZipIterator类的方式,因此它接受两个不同类型的迭代器对象?