【发布时间】:2018-12-13 18:48:00
【问题描述】:
我正在尝试为我自己的泛型类编写我的自己的迭代器。我一直在观看一些 YouTube 教程并在网上搜索。
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Pair<T> implements Iterable<T> {
private T left;
private T right;
public Pair(T left, T right){
this.left = left;
this.right = right;
}
public T getRight(){return this.right;}
public T getLeft(){return this.left;}
// own Iterator
@Override
public Iterator<T> iterator() {
return new myIterator;
}
class myIterator implements Iterator<T>{
T newLeft = null;
@Override
public boolean hasNext() {
if(newLeft == null && Pair.getLeft() != null){
return true;
}
else if(newLeft !=null){
return Pair.getRight() !=null;
}
else {
return false;
}
}
@Override
public T next() {
if(newLeft == null && Pair.getLeft() != null){
newLeft = Pair.getLeft();
return newLeft;
}
else if(newLeft != null){
T newRight = Pair.getLeft();
newLeft = Pair.getRight();
return newRight;
}
throw new NoSuchElementException();
}
}
}
IntelliJ 指出的问题是,我不能按照我尝试的方式在 Iterator-Class 中使用 getLeft 和 getRight,因为 无法从静态上下文中引用非静态方法 .我一直在研究静态等等,但无法解决这个问题。我是完全走错了路,还是我的方法至少有点接近?
更新
运行时:
public static void main(String[] args) {
Pair<Integer> intPair= new Pair(5,1);
Pair<String> stringPair=new Pair("foo", "bar");
Iterator<Integer> itr= intPair.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
我遇到一个无限循环,打印 5。所以,Iterator 本身可以工作,但我的方法有一个逻辑错误。正在努力,但我感谢任何输入。 :)
更新 2
发现逻辑错误:NewLeft 从未更改为 null。正在努力解决它。
UPDATE3
:已解决! 具有嵌入式迭代器类和主类的完整对类,调用如下:import java.util.Iterator;
import java.util.NoSuchElementException;
public class Pair<T> implements Iterable<T> {
private T left;
private T right;
public Pair(T left, T right){
this.left = left;
this.right = right;
}
public T getRight(){return this.right;}
public T getLeft(){return this.left;}
// size of a pair is always 2
public int size =2;
// own Iterator
@Override
public Iterator<T> iterator() {
return new myIterator();
}
// embedded iterator class
public class myIterator implements Iterator<T>{
T newLeft = null;
T newRight = null;
@Override
public boolean hasNext() {
if(newLeft == null && getLeft() != null){
return true;
}
else if(newLeft !=null && newRight == null){
newRight=getRight();
return getRight() !=null;
}
else {
return false;
}
}
@Override
public T next() {
if(newLeft == null && getLeft() != null){
newLeft = getLeft();
return newLeft;
}
else if(newLeft != null && getRight() != null){
newRight = getRight();
return newRight;
}
throw new NoSuchElementException();
}
}
}
主要:
import java.util.Iterator;
public class main {
public static void main(String[] args) {
Pair<Integer> intPair= new Pair(5,1);
Pair<String> stringPair=new Pair("foo", "bar");
Iterator<Integer> itr= intPair.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
Iterator<String> itrS= stringPair.iterator();
while(itrS.hasNext()){
System.out.println(itrS.next());
}
}
}
感谢所有提供帮助的人,是您让我找到了这个解决方案:)
【问题讨论】:
-
看来您需要将
Pair.getLeft()更改为getLeft()和Pair.getRight()更改为getRight() -
容易多了:
return Arrays.asList(left, right).iterator();. -
@AndyTurner 不完全正确,因为它不能处理 getRight() 或 getLeft() 返回 null 的情况。
-
@Eran 好的,所以创建一个没有空值的列表,并返回它的迭代器。
Stream.of(left, right).filter(Objects::nonNull).collect(toList()).iterator(). -
@Eran,谢谢,它成功了,错误消失了。目前正在测试