手动写一个类支持foreach循环

之前初学时看过可以实现Iterable接口实现Iterator迭代器的支持,并且也支持foreach循环。现在学习了数据结构,手动写一个单链表支持foreach循环吧。

手写foreach循环步骤:

1.实现Iteratable接口

2.内部类实现Iterator接口,重写getNext方法和next方法

例子:写了这两步即可实现foreach循环和Iterator迭代

package com.littlepage.foreach;

public class Node<T> {
    //member variable
    private T data;
    private Node<T> next;
    
    //constructor
    public Node() {
        data=null;
        next=null;
    }
    
    public Node(T t) {
        data=t;
    }

    //getters and setters
    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Node<T> getNext() {
        return next;
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }
    
    //toString
    @Override
    public String toString() {
        return data.toString();
    }

    //equals
    @SuppressWarnings("unchecked")
    @Override
    public boolean equals(Object obj) {
        Node<T> temp1=this;
        Node<T> node=(Node<T>)obj;
        if(!data.equals(node.getData())) return false;
        else if(next==null&&node.getNext()!=null) return false;
        else if(next!=null&&node.getNext()==null) return false;
        else if(next==null&&node.getNext()==null) return true;
        else{
            temp1=temp1.getNext();
            node=node.getNext();
            return temp1.equals(node);
        }
    }
}
package com.littlepage.foreach;

import java.util.Iterator;

public class SinglyLinkedList<T> implements Iterable<T> {
    //member variable
    private Node<T> head;
    private int size;
    
    //constructor
    public SinglyLinkedList() {
        head=new Node<>();
    }
    
    public SinglyLinkedList(T[] element) {
        head=new Node<T>();
        for(int i=0;i<element.length;i++){
            if(head.getData()==null) head.setData(element[i]);
            else {
                Node<T> temp=head;
                while(temp.getNext()!=null){
                    temp=temp.getNext();
                }
                temp.setNext(new Node<T>(element[i]));
            }
        }
        size=element.length;
    }
    
    public SinglyLinkedList(SinglyLinkedList<T> singlyLinkedList){
        head=singlyLinkedList.getHead();
        size=singlyLinkedList.getSize();
    }
    
    //getters and setters
    public Node<T> getHead() {
        return head;
    }

    public void setHead(Node<T> head) {
        this.head = head;
    }
    
    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    //toString
    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder("[");
        sb.append(head.getData()+",");
        Node<T> temp=head;
        while(temp.getNext()!=null){
            temp=temp.getNext();
            sb.append(temp.getData()+",");
        }
        sb.replace(sb.lastIndexOf(","), sb.lastIndexOf(",")+1, "]");
        return sb.toString();
    }
    
    //others method
    public void concat(SinglyLinkedList<T> list){
        Node<T> temp=head;
        while(temp.getNext()!=null){
            temp=temp.getNext();
        }
        temp.setNext(list.getHead());
        size+=list.getSize();
    }
    
    public Node<T> search(T element){
        Node<T> temp=head;
        if(head.getData().equals(element)) return head;
        while(temp.getNext()!=null){
            if(temp.getNext().getData().equals(element)) return temp.getNext();
            temp=temp.getNext();
        }
        return null;
    }
    
    public boolean contain (T element){
        Node<T> temp=head;
        if(head.getData().equals(element)) return true;
        while(temp.getNext()!=null){
            if(temp.getNext().getData().equals(element)) return true;
            temp=temp.getNext();
        }
        return false;
    }
    
    public void add(T element){
        if(head.getData()==null) head.setData(element);
        else{
            if(head.getNext()==null) head.setNext(new Node<>(element));
            else{
                Node<T> temp=head;
                while(temp.getNext()!=null){
                    temp=temp.getNext();
                }
                temp.setNext(new Node<>(element));
            }
        }
        size++;
    }
    
    
    public boolean remove (T element){
        Node<T> temp=head;
        if(head.getData().equals(element)) {
            head=head.getNext();
            size--;
            return true;
        }
        while(temp.getNext()!=null){
            if(temp.getNext().getData().equals(element)) {
                temp.setNext(temp.getNext().getNext());
                return true;
            }
            temp=temp.getNext();
        }
        return false;
    }
    
    public boolean replace (Object obj, T element){
        Node<T> temp=head;
        if(head.getData().equals(obj)) {
            head.setData(element);
            return true;
        }
        while(temp.getNext()!=null){
            if(temp.getNext().getData().equals(obj)) {
                temp.getNext().setData(element);
                return true;
            }
            temp=temp.getNext();
        }
        return false;
    }
    
    //getElement
    public T getElement(int index){
        if(index<0||index>=size) return null;
        Node<T> temp=head;
        if(index==0) return head.getData();
        else{
            for(int i=0;i<index;i++){
                temp=temp.getNext();
            }
            return temp.getData();
        }
    }
    
    //getNode
    public Node<T> getNode(int index){
        if(index<0||index>=size) return null;
        Node<T> temp=head;
        if(index==0) return head;
        else{
            for(int i=0;i<index;i++){
                temp=temp.getNext();
            }
            return temp;
        }
    }
    
    public void set(int index,T value){
        if(index<0) index=0;
        if(index>=size) index=size-1;
        Node<T> temp=head;
        if(index==0) head.setData(value);
        else{
            for(int i=0;i<index;i++){
                temp=temp.getNext();
            }
            temp.setData(value);
        }
    }
    
    @Override
    public boolean equals(Object obj) {
        @SuppressWarnings("unchecked")
        SinglyLinkedList<T> singlyLinkedList=(SinglyLinkedList<T>)obj;
        return head.equals(singlyLinkedList.getHead());
    }

    @Override
    public Iterator iterator() {
        class MyIterator implements Iterator{
            Node temp=head;
            @Override
            public boolean hasNext() {
                return temp!=null;
            }

            @Override
            public Object next() {
                Node<T> pre=temp;
                temp=temp.getNext();
                return pre.getData();
            }
        }
        return new MyIterator();
    }
}
package com.littlepage.foreach;

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        SinglyLinkedList<Integer> sll=new SinglyLinkedList<>();
        sll.add(5);
        sll.add(4);
        for (Integer e:sll) {
            System.out.println(e);
        }
    }
}

  

猜你喜欢

转载自www.cnblogs.com/littlepage/p/10822684.html