在Java中,我如何将自己的链表中的迭代器定义为Node



我想在我自己的链表中为Consumer的foreach方法实现Iterable接口,但我不知道如何让next((方法返回Node而不是泛型类型。我知道通常您会希望迭代器是存储在Node中的数据类型,但为了更灵活,我希望它是Node本身。我对泛型和Java还很陌生。

这是我班的相关部分。此外,还有一些添加和删除方法在这里并不真正感兴趣。

import java.util.Iterator;
class OwnList<Type> implements Iterable<T>{
class Node{
Type data;
Node next;
public Node(Type data, Node next){
this.data = data;
this.next = next;
}
}
Node head;
@Override
public <T> Iterator<T> iterator(){
Iterator<T> iterator = new Iterator<T>(){
private Node index = head;
@Override
public boolean hasNext(){
return index.next == null ? false : true;
}
@Override
public T next(){
return index = index.next;
}
@Override
public void remove(){
}
};
return iterator;
}

我把它分成了两个类,而不是把它全部合并成一个类。

Node.java

public class Node<T>
{
private T data;
private Node<T> next;
public Node(T data, Node<T> next)
{

this.data = data;
this.next = next;

}

public Node<T> next()
{

return this.next;

}

}

NodeList.java

import java.util.Iterator;
public class NodeList<T> implements Iterable<Node<T>>{
private Node<T> head;
@Override
public Iterator<Node<T>> iterator()
{

return 
new Iterator<Node<T>>()
{

private Node<T> index = head;

@Override
public boolean hasNext()
{
return index.next() == null ? false : true;
}

@Override
public Node<T> next()
{
return index = index.next();
}

@Override
public void remove()
{

}
};

}

}

EDIT-找到了另一种重写Node.java的方法。好处是它的代码要少得多。唯一的问题是,您的数据现在是不可变的。此外,这只适用于Java 14或更高版本。

Node.java-修改

import java.util.Iterator;
public record Node<T>(T data, Node<T> next)
{
public Node(Node<T> node)
{

this(node.data, node.next);

}
}

此外,您不需要对NodeList.java进行任何更改-您只需切换出Node.java即可使用此不可变版本。

最新更新