2011-05-18 15 views
5

Acabo de encontrar esta pregunta en un examen antiguo y me estoy preparando para un próximo examen. No puedo resolverlo:Implementando la interfaz Iterable

A continuación se muestra una clase parcial artificial que implementa la interfaz Iterable. El único propósito de esta clase es proporcionar un método para iterar sobre el atributo things.

Hay dos cosas que debemos completar en la clase para completarla. Aquí está la clase

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

que supongo que debe ser algo similar a:

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

    } 
    } 
} 

No estoy muy seguro de cómo dar cuerpo a una respuesta a esta pregunta, sin embargo, puede ayudar a nadie?

+2

Si se implementa la interfaz 'Comparable', ¿no debería tener un método' compare()? –

+0

su solución ignora la pregunta a favor del nombre de clase, en su lugar debe implementar Comparable . – josefx

+0

¿Qué tan "viejo" es el documento del examen donde lo leyó? Lo estoy preguntando porque es muy probable que haya sido escrito antes de que se lanzara Java 5 (por lo tanto, antes de que la palabra "iterable" significara la interfaz 'java.util.Iterable' para un desarrollador de Java). –

Respuesta

3

Su Iterator debe implementar todos los métodos desde la interfaz Iterator para encapsular la lógica de iteración.

En su caso, tendrá que mantener el índice de iteración actual en la matriz. Se puede ver en ArrayIterator de bienes comunes colecciones

+0

Estoy confundido, ¿cómo vas a implementar esto en mi caso? –

+0

exactamente como dije :) mantenga el índice de iteración actual. commons-collections es de código abierto, así que eche un vistazo al código allí. – Bozho

2

La cosa más fácil de hacer, probablemente sería crear un new ArrayList<String>() llena con los valores de things, y devolver el resultado de una llamada a su método .iterator(). Eso es ciertamente lo que haría en una situación con tiempo limitado (como un examen), y muy probablemente lo que haría en un escenario del mundo real, simplemente para mantener las cosas simples.

Puede escribir su propia clase ArrayIterator, o usar una de varias bibliotecas que puede encontrar en la web, pero parece que eso agregaría una complejidad innecesaria.

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

¿Está convirtiendo la matriz en una lista temporal en la memoria solo para iterarla? –

+0

Hay poca "conversión" en curso con 'Arrays.asList()'. Simplemente decora la matriz original con una vista de 'Lista', usando una clase de ayuda privada' java.util.Arrays.ArrayList'. –

+0

Básicamente está creando una lista de referencias a la matriz, que también tienen que asignarse un espacio adicional. Enlace: http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList (T ...) –

0

Puede utilizar ArrayIterator, o construir su propia iterador de esta manera:

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(); 
     } 
    } 

} 
Cuestiones relacionadas