2012-07-10 14 views
7

Estoy en proceso de escribir un trabajo de MR. Pero estoy atascado con un problema relacionado con un objeto Iterable. Necesito encontrar su tamaño. Lo fundí en un objeto List, pero estaba mal. (La lista se puede convertir en Iterable, pero no se puede hacer la reversión). Hay otra manera, es decir, usar un iterador para el objeto e incrementar un contador para cada valor. Pero esa no es una solución óptima. ¿Alguien puede sugerir una mejor manera?¿Cómo encontrar el tamaño de un Objeto Iterable?

Por favor, ayúdame. Gracias de antemano.

+0

Escriba su código aquí para que podamos verificarlo. –

+0

Esta pregunta realmente no se siente como un duplicado de la que está vinculada en la edición – shieldgenerator7

Respuesta

15

La interfaz Collection proporciona un método size() y se extiende Iterable. Si su iterador proviene de una colección, puede solicitar su tamaño, de lo contrario no tiene suerte, simplemente tiene que repetir hasta el final.

Aquí hay un truco que implementa esto:

public int size(Iterable<?> it) { 
    if (it instanceof Collection) 
    return ((Collection<?>)it).size(); 

    // else iterate 

    int i = 0; 
    for (Object obj : it) i++; 
    return i; 
} 
0

iterador no tiene un tamaño() sobre ella, pero algunas de las colecciones de la cual iterador se ha derivado tiene un tamaño(), como Java. util.LinkedList.size(). Por lo tanto, es posible que tenga que repetir en algunos casos.

+0

El problema es con la función de reductor: protected void final de reducir (clave del texto final, \t \t \t \t finales Iterable valores, el contexto Contexto definitiva) \t \t \t \t throws IOException, InterruptedException { ...... } Aquí los "valores" son un Objeto Iterable. Necesito encontrar su tamaño sin iterar. Pero eso no es posible ya que no es un objeto de colección. Necesito hacer otra operación después de encontrar el tamaño. Si estoy iterando sobre este objeto, luego de la iteración, el iterador estará apuntando a su último valor. Necesito reiniciarlo. Así que estoy usando un ResettableIterator para que después de la iteración pueda restablecerlo. –

+0

Debería poder solicitar un 'iterator()' tantas veces como desee de un 'Iterable', es por eso que obtiene' Iterable' y no 'Iterator' en' reduce'. Por lo tanto, 'Iterator a = values.iterator(), b = values.iterator();' es perfectamente válido y deben ser independientes siempre que no invoque 'remove()' en ninguno de ellos. – TWiStErRob

5

Tienes que pasar por el iterador y contar los elementos. Por ejemplo,

  while (iterator.hasNext()) { 
      iterator.next(); 
      count++; 
     } 

Esto no es muy limpia, pero iterador se utiliza con el propósito de Iterar y no proporciona ninguna API específica para eso.

Pero, ¿dónde se crea el iterador? Si proviene de otro objeto, por ejemplo, un objeto Collection, puede determinar el tamaño de la fuente y no el iterador en sí.

+0

Esto no funcionará en caso de un iterable. – Siddarth

Cuestiones relacionadas