Saltar al contenido

Obtener el tamaño de un Iterable en Java

Hola usuario de nuestro sitio web, encontramos la respuesta a tu interrogante, desplázate y la verás un poco más abajo.

Solución:

TL; DR: use el método de utilidad Iterables.size(Iterable) de la gran biblioteca Guayaba.

De sus dos fragmentos de código, debe usar el primero, porque el segundo eliminará todos los elementos de values, por lo que está vacío después. Cambiar una estructura de datos para una consulta simple como su tamaño es muy inesperado.

Para el rendimiento, esto depende de su estructura de datos. Si es, por ejemplo, de hecho, un ArrayListeliminar elementos desde el principio (lo que está haciendo su segundo método) es muy lento (calcular el tamaño se convierte en O (n * n) en lugar de O (n) como debería ser).

En general, si existe la posibilidad de que values es en realidad un Collection y no solo un Iterablemarca esto y llama size() en caso:

if (values instanceof Collection) 
  return ((Collection)values).size();

// use Iterator here...

la llamada a size() generalmente será mucho más rápido que contar el número de elementos, y este truco es exactamente lo que Iterables.size(Iterable) de guayaba hace por ti.

Si está trabajando con Java 8, puede usar:

Iterable values = ...
long size = values.spliterator().getExactSizeIfKnown();

solo funcionará si la fuente iterable tiene un tamaño determinado. La mayoría de Spliterators for Collections lo harán, pero es posible que tenga problemas si proviene de un HashSeto ResultSetpor ejemplo.

Puede consultar el javadoc aquí.

Si Java 8 no es una opcióno si no sabe de dónde viene el iterable, puede usar el mismo enfoque que la guayaba:

  if (iterable instanceof Collection) 
        return ((Collection) iterable).size();
     else 
        int count = 0;
        Iterator iterator = iterable.iterator();
        while(iterator.hasNext()) 
            iterator.next();
            count++;
        
        return count;
    

Esto es quizás un poco tarde, pero puede ayudar a alguien. Me encuentro con un problema similar con Iterable en mi base de código y la solución fue usar for each sin llamar explícitamente values.iterator();.

int size = 0;
for(T value : values) 
   size++;

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *