2011-05-18 98 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(); 
     } 
    } 

}