实现Iterable接口

时间:2011-05-18 20:04:56

标签: java interface iterator 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>( ) {

   }
   }
}

我不确定如何充实这个问题的答案,但有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

您的Iterator必须实现Iterator接口中的所有方法才能封装迭代逻辑。

在您的情况下,它必须保持数组中的当前迭代索引。您可以从commons-collections

查看ArrayIterator

答案 1 :(得分:2)

最简单的方法可能是创建一个填充new ArrayList<String>()中值的things,并将调用结果返回给.iterator()方法。这肯定是我在有限时间(如考试)的情况下所做的,而且很可能是我在现实场景中所做的,只是为了让事情变得简单。

您可以编写自己的ArrayIterator类,或者使用您可以在网络上找到的各种库中的类,但这似乎会增加不必要的复杂性。

答案 2 :(得分: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();
    }
}

答案 3 :(得分: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();
        }
    }

}