程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中設計與使用迭代器

Java中設計與使用迭代器

編輯:關於JAVA

1.迭代器設計

迭代器是一種模式,它可以使得對於序列類型的數據結構的遍 歷行為與被遍歷的對象分離,即我們無需關心該序列的底層結構是 什麼樣子的。

一般的迭代器對外提供的接口有:

[1]檢查是否至序列末端;

[2]返回當前的對象;

[3]過渡到下一個對象。

我們基於以上三點,提供一個迭代器Interface。

<<interface>>MyIterator.java

package com.zj.iterator;
public interface MyIterator<T> {
   boolean end();
   T current();
   void next();
}

接下來,設計一個序列,並部署上面設計的迭代器。我們使用 一個ArrayList作為底層的數據結構,設計一個內部類 LinksIterator來實現MyIterator接口,這樣可以提供迭代器功能 。通過public MyIterator<T> browser()方法返回該迭代器 的實例。

Links.java

package com.zj.iterator;
import java.util.ArrayList;
import java.util.List;
public class Links<T> {
   private List<T> items = new ArrayList<T>();
   public void add(T x) {
    items.add(x);
   }
   private class LinksIterator implements MyIterator<T> {
    private int i = 0;
    public boolean end() {
      return i == items.size();
    }
    public T current() {
      return items.get(i);
    }
    public void next() {
      if (i < items.size())
        i++;
    }
   }
   public MyIterator<T> browser() {
    return new LinksIterator();
   }
   public static void main(String[] args) {
    Links<Integer> links = new Links<Integer>();
    for (int i = 1; i < 6; i++)
      links.add(i);
    // use MyIterator
    MyIterator<Integer> myItr = links.browser ();
    while (!myItr.end()) {
      System.out.print(myItr.current() + " ");
      myItr.next();
    }
   }
}

在Link2.java中,我們使用一個匿名內部類替代Links.java中內部類的設計。

Links2.java

package com.zj.iterator;
import java.util.ArrayList;
import java.util.List;
public class Links2<T> {
   private List<T> items = new ArrayList<T>();
   public void add(T x) {
    items.add(x);
   }
   public MyIterator<T> browser() {
    return new MyIterator<T>() {
      private int i = 0;
      public boolean end() {
        return i == items.size();
      }
      public T current() {
        return items.get(i);
      }
      public void next() {
        if (i < items.size())
          i++;
      }
    };
   }
   public static void main(String[] args) {
    Links2<Integer> links = new Links2<Integer>();
    for (int i = 1; i < 6; i++)
      links.add(i);
    // use MyIterator
    MyIterator<Integer> myItr = links.browser ();
    while (!myItr.end()) {
      System.out.print(myItr.current() + " ");
      myItr.next();
    }
   }
}

2.使用Java提供的迭代器

Java提供一個專門的迭代器 <<interface>>Iterator,我們可以對某個序列實現 該interface,來提供標准的Java迭代器。

<<interface>>Iterator.java

package java.util;
public interface Iterator<E> {
   boolean hasNext();
   E next();
   void remove();
}

我們在Links2.java的基礎上,重新設計並使用實現標准的 Iterator接口方法。

Links3.java

package com.zj.iterator.standard;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Links3<T> {
   private List<T> items = new ArrayList<T>();
   public void add(T x) {
    items.add(x);
   }
   public Iterator<T> iterator() {
    return new Iterator<T>() {
      private int index = 0;
      public boolean hasNext() {
        return index < items.size();
      }
      public T next() {
        return items.get(index++);
      }
      public void remove() { // Not implemented
        throw new UnsupportedOperationException ();
      }
    };
   }
   public static void main(String[] args) {
    Links3<Integer> links = new Links3<Integer>();
    for (int i = 1; i < 6; i++)
      links.add(i);
    // use Standard Iterator
    Iterator<Integer> myItr = links.iterator ();
    while (myItr.hasNext())
      System.out.print(myItr.next() + " ");
   }
}

3.Java迭代器與Foreach語法

Java中還提供了一個Iterable接口,該接口要求提供一個標准 的Iterator實現。

<<interface>>Iterable.java

package java.lang;
import java.util.Iterator;
public interface Iterable<T> {
   Iterator<T> iterator();
}

只要實現了該接口,就可以通過Foreach語法遍歷你的底層序列 。Links4.java實現了Iterable接口,則就可以使用Foreach語法遍 歷它的底層序列。

Links4.java

package com.zj.iterator.standard;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Links4<T> implements Iterable<T> {
   private List<T> items = new ArrayList<T>();
   public void add(T x) {
    items.add(x);
   }
   public Iterator<T> iterator() {
    return new Iterator<T>() {
      private int index = 0;
      public boolean hasNext() {
        return index < items.size();
      }
      public T next() {
        return items.get(index++);
      }
      public void remove() { // Not implemented
        throw new UnsupportedOperationException ();
      }
    };
   }
   public static void main(String[] args) {
    Links4<Integer> links = new Links4<Integer>();
    for (int i = 1; i < 6; i++)
      links.add(i);
    // use Foreach
    for (Integer integer : links)
      System.out.print(integer + " ");
   }
}

你也可以提供該接口的多個不同的實現,基於此來提供多個不 同功能的迭代器。Links5.java中提供了兩種不同功能的迭代器, 除了常規的順序遍歷迭代器外,還提供一個遍歷偶序號元素的迭代 器。

Links5.java

package com.zj.iterator.standard;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Links5<T> implements Iterable<T> {
   private List<T> items = new ArrayList<T>();
   public void add(T x) {
    items.add(x);
   }
   public Iterator<T> iterator() {
    return new Iterator<T>() {
      private int index = 0;
      public boolean hasNext() {
        return index < items.size();
      }
      public T next() {
        return items.get(index++);
      }
      public void remove() { // Not implemented
        throw new UnsupportedOperationException ();
      }
    };
   }
   public Iterable<T> even() {
    return new Iterable<T>() {
      public Iterator<T> iterator() {
        return new Iterator<T>() {
          private int index = 0;
          public boolean hasNext() {
           return index < items.size();
          }
          public T next() {
           index += 2;
           return items.get(index - 2);
          }
          public void remove() { // Not implemented
           throw new UnsupportedOperationException();
          }
        };
      }
    };
   }
   public static void main(String[] args) {
    Links5<Integer> links = new Links5<Integer>();
    for (int i = 1; i < 6; i++)
      links.add(i);
    // use Foreach default
    for (Integer integer : links)
      System.out.print(integer + " ");
    System.out.println();
    // use Foreach even
    for (Integer integer : links.even())
      System.out.print(integer + " ");
   }
}

本文出自 “子 孑” 博客,請務必保留此出處

http://zhangjunhd.blog.51cto.com/113473/69969

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved