反復出力(イテレータ、反復子、列挙、foreachの)

ディレクトリ


イテレータ

出力のみの正のサイクルに一度データ。
ここに画像を挿入説明

一般的な方法:

方法 説明
パブリックブールのhasNext() データがnullであるか否かが判断された場合
空削除をデフォルト() (使用することが困難)データを削除
公共E次の() 現在のデータを取得します

例:

List<String> list = new ArrayList<>();
        list.add("1");
        list.add("3");
        list.add("5");
        list.add("7");
        list.add("9");
        list.add("2");
        list.add("4");
        list.add("6");
        list.add("8");
        list.add("10");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {	//判断下一个数据是否为空
            String value = iterator.next();		//获取当前数据
            if ("3".equals(value)) {
                iterator.remove();	//删除数据,不会影响节点
            } else {
                System.out.println(value);
            }
        }

結果:

1
5
7
9
2
4
6
8
10

リストの中で、セット、コレクション、リストは、get()メソッドを持っている、あなたは、インデックスに応じてデータを取得することができます。
イテレータ出力get()メソッドのリスト:使用は、get()メソッドは、インデックスは、出力データと一致するたびに要求され、(N + 1)の時間複雑N、性能は強くありません

反復子(双方向イテレータ出力)

データは、出力データは、逆であってもよいし、順次出力することができます。

内部ポインタの所望の出力の逆動作の存在下での反復子は、データポインタ到達は、その後、出力にので出力が正である必要があり、出力を反転する、反転させることができなければなりません。
ここに画像を挿入説明

一般的な方法:

方法 説明
パブリックブールhasPrevious() データが空であるか否かの決意
公共E前の(); データを取得します

例:

List<String> list = new ArrayList<>();
        list.add("a");
        list.add("c");
        list.add("b");
        list.add("m");
        list.add("a");
        list.add("d");
        list.add("g");
        list.add("j");
        list.add("l");
        list.add("q");
        ListIterator<String> listIterator = list.listIterator();
        System.out.print("正向输出:");
        while (listIterator.hasNext()) {
            System.out.print(listIterator.next() + "、");
        }
        System.out.print("\n反向输出:");
        while (listIterator.hasPrevious()) {
            System.out.print(listIterator.previous() + "、");
        }

結果:

正向输出:a、c、b、m、a、d、g、j、l、q、
反向输出:q、l、j、g、d、a、m、b、c、a、

列挙

初期の反復の出力には、今だけのベクトルを使用することができます。
ここに画像を挿入説明
一般的な方法:

方法 説明
パブリックブールhasMoreElements() データがnullであるか否かが判断された場合
公共EのnextElement() 現在のデータを取得します

例:

 Vector<String> vector = new Vector<>();
        vector.add("a");
        vector.add("b");
        vector.add("c");
        vector.add("d");
        vector.add("e");
        vector.add("f");
        Enumeration<String> enumeration = vector.elements();
        while(enumeration.hasMoreElements()){
            System.out.println(enumeration.nextElement());
        }

結果:

a
b
c
d
e
f

foreachの

Foreachループ出力は、カスタム出力するクラスオブジェクトは、反復処理可能インタフェースを実装する必要がある場合、定義されたイテレータ内部クラス内に実装されなければならないインタフェースでオーバーライドされたメソッドのイテレータイテレータオブジェクトのインスタンスを返します。

ここに画像を挿入説明

例:カスタムクラスの出力

public class Demo01 {
    public static void main(String[] args) {
        Ball ball = new Ball();
        for (String b:ball) {
            System.out.print(b+"、");
        }
    }
}
class Ball implements Iterable<String>{
    private String[] brand = new String[]{"Hello","World"};
    private int footer;

    @Override
    public Iterator<String> iterator() {
        return new BallIter();
    }

    private class BallIter implements Iterator<String>{

        @Override
        public boolean hasNext() {
            //表示数组存在数据
            return Ball.this.footer < Ball.this.brand.length;
        }

        @Override
        public String next() {
            //返回数据
            return brand[Ball.this.footer++];
        }
    }
}

結果:

Hello、World、

例:カスタム出力リストのforeach

public class Demo02 {
    public static void main(String[] args) {
        ILink<String> link = new LinkImpl<>();
        link.add("1");
        link.add("2");
        for (String str:link) {
            System.out.println(str+"、");
        }
    }
}
interface ILink<T> extends Iterable<T>{
    /**
     *链表数据增加
     * @param data 数据
     */
    public void add(T data);
}
class LinkImpl<T> implements ILink<T>{
    private Node root;
    private Node<T> last;
    private Node currentNode;

    @Override
    public Iterator<T> iterator() {
        this.currentNode = this.root;
        return new LinkIter<>();
    }

    private static class Node<T>{
        private T data;
        private Node next;

        public Node() {

        }

        public Node(T data) {
            this.data = data;
        }
    }
    @Override
    public void add(T data) {
        Node<T> node = new Node<>(data);
        if(this.root == null){
            this.root = node;
        }else{
            this.last.next = node;
        }
        this.last = node;
    }

    private class LinkIter<T> implements Iterator<T>{

        @Override
        public boolean hasNext() {
            return LinkImpl.this.currentNode!=null;
        }

        @Override
        public T next() {
            T data = (T) LinkImpl.this.currentNode.data;
            LinkImpl.this.currentNode = LinkImpl.this.currentNode.next;
            return data;
        }
    }
}

結果:

12
公開された61元の記事 ウォンの賞賛0 ビュー2181

おすすめ

転載: blog.csdn.net/sabstarb/article/details/104602390