我想创建一个迭代器类,它允许我通过泛型类型(例如lst1整数,lst2字符串)列表遍历一个接一个的项目。 为此,我必须考虑以下给出的情况。如何在Java中迭代通过两个不同类型的一个接一个项目的通用列表?
该接口是一个通用的迭代器。这部分代码不能修改。
interface Iterator<E> {
E next();
boolean hasNext();
}
列表类也定义如下。最重要的是,一个列表对象可以用方法getIterator()返回一个迭代器对象。这部分代码不能修改。
class List<T> {
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<T> {
ListNode pos;
ListIterator() {
pos = head;
}
public T next() {
T res = pos.val;
pos = pos.next;
return res;
}
public boolean hasNext() {
return pos != null;
}
}
Iterator<T> getIterator() {
return this.new ListIterator();
}
}
让我们假设两个列表都有相同的类型,现在他们也有相同的长度。我试着用两个迭代器对象创建一个类,并使用迭代器对象的方法来实现接口迭代器。这部分代码是由我创建的,可以修改。
class ZipIterator<T> implements Iterator<T>
{
int counter;
Iterator<T> first;
Iterator<T> second;
ZipIterator (Iterator<T> f, Iterator<T> 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<Integer> lst1 = new List<>();
List<Integer> lst2 = new List<>();
lst1.prepend(3);
lst1.prepend(2);
lst1.prepend(1);
lst2.prepend(8);
lst2.prepend(9);
lst2.prepend(10);
Iterator<Integer> it1 = lst1.getIterator();
Iterator<Integer> it2 = lst2.getIterator();
ZipIterator<Integer> 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类的方式,因此它接受两个不同类型的迭代器对象?
是否有对任何约束两种类型?如果没有,你可以做的最好的就是返回Object。 –
您发布的哪部分代码是您在作业中给定的部分,您可以修改哪部分? – user1803551
好吧,我可以给出答案,但这会消除作业的所有困难。我可以给出一个提示,看看[PECS](http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super)。 –