如何使 class 在 Java 中可迭代以使用 foreach 循环
How can I make a class iterable in Java to use foreach loop
我尝试创建一个手动 LinkedList class 然后我创建了一个函数来合并两个 LinkedList。我为我的 LinkedList class 实现了可迭代的,以便使用 foreach 循环,但出了点问题。我不知道如何覆盖 iterator() 函数来解决问题。这是我的代码:
Node.java
package app;
public class Node<R> {
private R Data;
private Node<R> nextNode;
public final void setData(R data) {
Data = data;
}
public R getData() {
return Data;
}
public void setNextNode(Node<R> nextNode) {
this.nextNode = nextNode;
}
public Node<R> getNextNode() {
return nextNode;
}
public Node(R dR){
this.setData(dR);
}
}
LinkedList.java
package app;
import java.util.Iterator;
public class LinkedList<R> implements java.lang.Iterable<R>{
private Node<R> headNode;
public void addNode(Node<R> nR){
if(headNode == null){
headNode = nR;
} else {
nR.setNextNode(headNode);
this.headNode = nR;
}
}
public void addData(R dR){
Node<R> nR = new Node<>(dR);
addNode(nR);
}
public LinkedList(){
headNode = null;
}
@Override
public Iterator<R> iterator() {
return null;
}
}
App.java
package app;
public class App {
public static <R>LinkedList<R> unionLinkedList(LinkedList<R> list , LinkedList<R> list2){
LinkedList<R> unionLinkedList = new LinkedList<>();
for (R dR : list) {
unionLinkedList.addData(dR);
}
for (R dR : list2) {
unionLinkedList.addData(dR);
}
return unionLinkedList;
}
public static void main(String[] args) throws Exception {
LinkedList<Integer> list = new LinkedList<>();
LinkedList<Integer> list2 = new LinkedList<>();
list.addData(3);
list.addData(9);
list.addData(8);
list2.addData(11);
list2.addData(5);
list2.addData(7);
LinkedList<Integer> u = unionLinkedList(list, list2);
}
}
我知道我必须在 iterator()
中更改 return null;
,但我不知道应该用什么替换它。
您实现了 Iterable
接口。
public interface Iterable
Implementing this interface allows an object to be the target of the
"for-each loop" statement.
至少你需要return一个迭代器。
Iterator iterator()
Returns an iterator over elements of type T.
'null' (如您的代码中所示)不是迭代器。您需要实现一个 class(如果您愿意,可以嵌套),它知道如何迭代您的特定链表实现。可能,它所需要的只是一个 'next node to process' 成员; next() 和 hasNext() 方法可以用它来实现。
最后我可以通过这个修改来完成:
@Override
public Iterator<R> iterator() {
return new Iterator<R>(){
Node<R> current = (Node<R>) headNode;
@Override
public boolean hasNext(){
return current != null;
}
@Override
public R next(){
if (hasNext()){
R dR = current.getData();
current = current.getNextNode();
return dR;
}
return null;
}
};
}
在LinkedList.java
我尝试创建一个手动 LinkedList class 然后我创建了一个函数来合并两个 LinkedList。我为我的 LinkedList class 实现了可迭代的,以便使用 foreach 循环,但出了点问题。我不知道如何覆盖 iterator() 函数来解决问题。这是我的代码:
Node.javapackage app;
public class Node<R> {
private R Data;
private Node<R> nextNode;
public final void setData(R data) {
Data = data;
}
public R getData() {
return Data;
}
public void setNextNode(Node<R> nextNode) {
this.nextNode = nextNode;
}
public Node<R> getNextNode() {
return nextNode;
}
public Node(R dR){
this.setData(dR);
}
}
LinkedList.java
package app;
import java.util.Iterator;
public class LinkedList<R> implements java.lang.Iterable<R>{
private Node<R> headNode;
public void addNode(Node<R> nR){
if(headNode == null){
headNode = nR;
} else {
nR.setNextNode(headNode);
this.headNode = nR;
}
}
public void addData(R dR){
Node<R> nR = new Node<>(dR);
addNode(nR);
}
public LinkedList(){
headNode = null;
}
@Override
public Iterator<R> iterator() {
return null;
}
}
App.java
package app;
public class App {
public static <R>LinkedList<R> unionLinkedList(LinkedList<R> list , LinkedList<R> list2){
LinkedList<R> unionLinkedList = new LinkedList<>();
for (R dR : list) {
unionLinkedList.addData(dR);
}
for (R dR : list2) {
unionLinkedList.addData(dR);
}
return unionLinkedList;
}
public static void main(String[] args) throws Exception {
LinkedList<Integer> list = new LinkedList<>();
LinkedList<Integer> list2 = new LinkedList<>();
list.addData(3);
list.addData(9);
list.addData(8);
list2.addData(11);
list2.addData(5);
list2.addData(7);
LinkedList<Integer> u = unionLinkedList(list, list2);
}
}
我知道我必须在 iterator()
中更改 return null;
,但我不知道应该用什么替换它。
您实现了 Iterable
接口。
public interface Iterable
Implementing this interface allows an object to be the target of the "for-each loop" statement.
至少你需要return一个迭代器。
Iterator iterator()
Returns an iterator over elements of type T.
'null' (如您的代码中所示)不是迭代器。您需要实现一个 class(如果您愿意,可以嵌套),它知道如何迭代您的特定链表实现。可能,它所需要的只是一个 'next node to process' 成员; next() 和 hasNext() 方法可以用它来实现。
最后我可以通过这个修改来完成:
@Override
public Iterator<R> iterator() {
return new Iterator<R>(){
Node<R> current = (Node<R>) headNode;
@Override
public boolean hasNext(){
return current != null;
}
@Override
public R next(){
if (hasNext()){
R dR = current.getData();
current = current.getNextNode();
return dR;
}
return null;
}
};
}
在LinkedList.java