【发布时间】:2016-08-13 13:37:12
【问题描述】:
我想创建一个迭代器类,它允许我一个接一个地遍历具有泛型类型(例如 lst1 整数、lst2 字符串)的列表。 为此,我必须考虑以下给定的情况。
接口是一个通用的迭代器。这部分代码不能修改。
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();
}
}
让我们假设两个列表具有相同的类型,并且现在它们也具有相同的长度。我尝试用两个迭代器对象创建一个类,并使用迭代器对象的方法来实现接口Iterator。这部分代码是我自己创建的,可以修改。
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。 -
您发布的代码的哪一部分是作业中给定的,您可以修改哪一部分?
-
好吧,我可以给出答案,但这会消除作业的所有困难。不过我可以给个提示,看看PECS。
-
Iterator 和 List 类是给定的,不能修改。所有其他代码都是我制作的,可以修改。我会尝试返回 Object 并检查 PECS。
-
要明确(我目前正在写一个答案,这个问题出现了),你必须在课堂上有
implements Iterator<...>,还是你自己做的?
标签: java list generics iterator wildcard