Java ArrayList count es quizás una de las preguntas más habituales en el mundo de Java cuando uno empieza . Todo el mundo necesita saber cuantos elementos dispone un ArrayList . Me acuerdo que cuando yo empece a programar en Java rápidamente busque la propiedad length para saber los objetos que contiene un ArrayList .
package com.arquitecturajava; public class Principal { public static void main(String[] args) { int[] numeros=new int[]{1,2,3,4,5};; for( int i=0;i<numeros.length;i++) { System.out.println(numeros[i]); } } }
El resultado le vemos en pantalla:
Sin embargo un ArrayList no funciona así y no tiene una propiedad length. Así pues si queremos saber la longitud de un ArrayList deberemos usar la propiedad size(). Esto nos devolverá el tamaño de nuestro array y nos permitirá recorrerlo.
package com.arquitecturajava; import java.util.ArrayList; public class Principal2 { public static void main(String[] args) { ArrayList<Integer> numeros=new ArrayList(); numeros.add(1); numeros.add(2); numeros.add(3); numeros.add(4); numeros.add(5); for( int i=0;i<numeros.size();i++) { System.out.println(numeros.get(i)); } } }
Objetos e igualdad
Hasta aquí todo es muy sencillo sin embargo muchas veces la siguiente pregunta que aparece es cuantas veces aparece el número 3 en el ArrayList o el texto tal en la lista Para eso hay que recordar que lo más importante es tener correctamente sobrescritos los métodos equals y hashcode de la clase en cuestión. Yo voy a hacer un ejemplo apoyándome en la clase String que pertenece al API de Java y usar una lista de cadenas.
package com.arquitecturajava; import java.util.ArrayList; public class Principal2 { public static void main(String[] args) { ArrayList<String> textos=new ArrayList<String>(); textos.add("hola"); textos.add("que"); textos.add("tal"); textos.add("estas"); textos.add("hola"); int contador=0; for(String texto:textos) { if (texto.equals("hola")) { contador++; } } System.out.println(contador); } }
En este caso estoy buscando cuantas veces aparece la cadena “hola” en un ArrayList. Uso un simple contador y lo voy incrementando según la igualdad se cumple . Esta es una solución digamos…. habitual . Pero se pueden localizar soluciones más elegantes
Java ArrayList count y funciones
package com.arquitecturajava; import java.util.ArrayList; public class Principal4 { public static void main(String[] args) { ArrayList<String> textos=new ArrayList<String>(); textos.add("hola"); textos.add("que"); textos.add("tal"); textos.add("estas"); textos.add("hola"); System.out.println(textos.stream().filter(t->t.equals("hola")).count()); } }
Esta solución es mucho más compacta y nos evitamos el usar variables adicionales . Convertimos la lista en un Stream y la filtramos para finalmente contar el número de elementos existentes
¿Es suficiente?
En principio parece que sí y que hemos usado las capacidades de Java 8 de forma correcta y elegante pero a veces es importante conocer las APIs con las clases y métodos que aportan . Mucho mas elegante hubiera sido usar el método frequency de la clase Collections ;).
package com.arquitecturajava; import java.util.ArrayList; import java.util.Collections; public class Principal4 { public static void main(String[] args) { ArrayList<String> textos=new ArrayList<String>(); textos.add("hola"); textos.add("que"); textos.add("tal"); textos.add("estas"); textos.add("hola"); System.out.println(Collections.frequency(textos,"hola")); } }
Cuanto más sepamos del API del lenguaje mejores programadores seremos y más sencillo será nuestro código
Muchas gracias por tu Aporte Cecilio.
Una pregunta: Muchas veces en las colecciones no sólo buscamos “cadenas literales exactas”, sino también RegEx (Expresiones Regulares). La API Collections al parecer no aborda este tipo de filtros ?. En ese caso, la solución es continuar con los filtros al estilo de “la vieja escuela”?
https://www.arquitecturajava.com/java-pattern-predicate-y-filtrados
este articulo te puede ser util
El problema quizas es que falta literatura actual que aborden algunas areas del API de Java, incluyendo el API Collections que ha sufrido cambios desde la 1.2. Como ejemplo el libro “Java Generics and Collections” que fue escrito en una version anterior de Java. Lo mismo ocurre para el API Reflections que en un principio no soportaba lo que luego se incorporo: genericos y anotaciones. Son solamente dos ejemplos.
si es cierto hay poca documentación
Gracias!!!! que buena enseñanza “Cuanto más sepamos del API del lenguaje mejores programadores seremos y más sencillo será nuestro código”
de nada 🙂