我想創建一個迭代器類,它允許我通過泛型類型(例如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)。 –