Реализация интерфейса Iterable - PullRequest
5 голосов
/ 19 мая 2011

Я только что нашел этот экзаменационный вопрос в старой экзаменационной работе и готовлюсь к предстоящему экзамену.Я не могу понять это:

Ниже изображен надуманный частичный класс, который реализует интерфейс 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 ]

3 голосов
/ 19 мая 2011

Ваш Iterator должен реализовать все методы из интерфейса Iterator для инкапсуляции логики итерации.

В вашем случае он должен будет содержать текущий индекс итерации в массиве. Вы можете посмотреть на ArrayIterator из общих коллекций

2 голосов
/ 19 мая 2011

Возможно, проще всего было бы создать new ArrayList<String>(), заполненный значениями в things, и вернуть результат вызова его .iterator() методу.Это, безусловно, то, что я буду делать в ситуации с ограниченным временем (например, на экзамене), и вполне вероятно, что я буду делать в реальном сценарии, просто чтобы все было просто.

Вы можете написать свой собственный класс ArrayIterator или использовать один из различных библиотек, которые можно найти в Интернете, но, похоже, это добавит ненужную сложность.

0 голосов
/ 03 декабря 2014

Вы можете использовать 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();
        }
    }

}
0 голосов
/ 19 мая 2011
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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...