有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型如何在我自己的链表中将迭代器定义为Java中的节点?

我想在我自己的链表中为使用Consumer的foreach方法实现Iterable接口,但我不知道如何使next()方法返回一个节点而不是泛型类型。我知道通常您希望迭代器是存储在节点中的数据类型,但为了更大的灵活性,我希望它是节点本身。一般来说,我对泛型和Java相当陌生

这是我课堂上的相关部分。此外,还有一些add和remove方法在这里并不真正感兴趣

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;
    }


共 (1) 个答案

  1. # 1 楼答案

    我把它分为两个类,而不是把它们都混在一起

    节点。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;
       
       }
       
    }
    

    节点列表。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()
                {
                
                }
             };
       
       }
       
    }
    

    编辑-找到了另一种重写节点的方法。java。好的一面是它的代码要少得多。唯一的问题是您的数据现在是shallowly immutable。而且,这只适用于Java14或更高版本

    节点。java-返工

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

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