2011-05-18 162 views
5

我剛剛在舊的考試中發現了這個考題,並且正準備參加即將到來的考試。我想不出來:實現Iterable接口

下面描述了一個實現了Iterable接口的設計分部類。此類的唯一目的是提供迭代屬性的方法things.

我們需要在課程中填寫兩件事才能完成它。這裏是我猜測它應該是類似的東西類

private class PartialIterableClass /*FILL IN */ { 
    private String[] things; 
    public PartialIterableClass(String[] things){ 
     this.things = things; 
    } 
    /*FILL IN 2*/ 
} 

private class PartialIterableClass implements Iterable<PrivateIterableClass> { 
    private String[] things; 
    public PartialIterableClass(String[] things){ 
     this.things = things; 
    } 
    public Iterator<PartialIterableClass> iterator(){ 
    return new Iterator<PartialIterableClass>() { 

    } 
    } 
} 

我真的不知道怎麼回答充實到這個問題,雖然,任何人可以幫助?

+2

如果它實現了'Comparable'接口,應該不是它有一個比較'()'方法? – 2011-05-18 20:14:10

+0

您的解決方案忽略贊成類名的問題,您應該改爲使用Comparable 。 – josefx 2011-05-18 20:35:23

+0

你讀過這篇文章的考卷是「老」嗎?我在問,因爲它很可能是在Java 5發佈之前編寫的(因此,在「iterable」這個詞之前意味着Java開發者的java.util.Iterable接口之前)。 – 2011-05-18 20:59:20

回答

3

您的Iterator必須實現Iterator接口中的所有方法才能封裝迭代邏輯。在你的情況下,它將不得不在數組中保存當前的迭代索引。你可以看一下ArrayIterator commons-collections提供

+0

我很困惑,你如何去執行這個在我的情況? – 2011-05-18 21:03:31

+0

就像我說的:)保存當前的迭代索引。 commons-collections是開源的,所以請看看那裏的代碼。 – Bozho 2011-05-18 21:06:07

2

做很可能會創造things與值填充一個new ArrayList<String>(),並返回到其.iterator()方法調用的結果,最簡單的事情。這當然是我在時間有限的情況下(比如考試)所做的事情,而且很可能是我在現實世界中做的事情,只是爲了保持簡單。

您可以編寫自己的ArrayIterator類,或者使用可以在網上找到的各種庫中的一個,但似乎會增加不必要的複雜性。

0
private class PartialIterableClass implements Iterable<String> { 
    private String[] things; 
    public PartialIterableClass(String[] things){ 
     this.things = things; 
    } 

    @Override 
    public Iterator<String> iterator() { 
     return Arrays.asList(things).iterator(); 
    } 
} 
+0

您正在將數組轉換爲內存中的臨時列表以迭代它? – 2014-12-02 06:19:49

+0

使用'Arrays.asList()'進行的轉換很少。它只是用一個'List'視圖來裝飾原始數組,使用一個專用輔助類'java.util.Arrays.ArrayList'。 – 2014-12-02 15:11:32

+0

您基本上正在創建一個數組引用列表,這也是一個額外的空間必須分配。鏈接:http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T ...) – 2014-12-03 04:33:01

0

您可以使用ArrayIterator,或建立自己的迭代器,像這樣:

package arrayiterator; 

import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 

class ArrayIterator_int 
{ 

    public static void main(String[] args) 
    { 
     int [] arr = { 5, 4, 3, 2, 1 }; 

     ArrayIterator_int iterator = new ArrayIterator_int(arr); 

     while (iterator.hasNext()) 
     { 
      System.out.println(" " + iterator.next()); 
     } 
    } 

    private int cursor; 
    private final int [] array; 
    private static final Lock lock = new ReentrantLock(); 

    public ArrayIterator_int (int [] array) 
    { 
     this.array = array; 
     this.cursor = 0; 
    } 

    public boolean hasNext() 
    { 
     boolean hasNext = false; 
     lock.lock(); 

     try 
     { 
      hasNext = ((this.cursor+1) < this.array.length); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      lock.unlock(); 
      return hasNext; 
     } 

    } 

    public int next() throws ArrayIndexOutOfBoundsException 
    { 
     int next = 0; 
     lock.lock(); 

     try 
     { 
      next = this.array[++this.cursor]; 
     } 
     catch(ArrayIndexOutOfBoundsException e) 
     { 
      throw e; 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      lock.unlock(); 
      return next; 
     } 
    } 

    public int read() throws ArrayIndexOutOfBoundsException 
    { 
     int read = 0; 
     lock.lock(); 

     try 
     { 
      read = this.array[this.cursor]; 
     } 
     catch(ArrayIndexOutOfBoundsException e) 
     { 
      throw e; 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      lock.unlock(); 
      return read; 
     } 
    } 

    public void write (int newVal) throws ArrayIndexOutOfBoundsException 
    { 
     lock.lock(); 

     try 
     { 
      this.array[this.cursor] = newVal; 
     } 
     catch(ArrayIndexOutOfBoundsException e) 
     { 
      throw e; 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      lock.unlock(); 
     } 
    } 

}