Tengo una ArrayList
, una clase de colección de Java, como sigue:
ArrayList<String> animals = new ArrayList<String>();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");
Como puede ver, animals
ArrayList
consta de 3 bat
elementos y un owl
elemento. Me preguntaba si hay alguna API en el marco de la Colección que devuelve el número de bat
ocurrencias o si hay otra forma de determinar el número de ocurrencias.
Descubrí que la Colección de Google Multiset
tiene una API que devuelve el número total de ocurrencias de un elemento. Pero eso es compatible solo con JDK 1.5. Nuestro producto se encuentra actualmente en JDK 1.6, por lo que no puedo usarlo.
Respuestas:
Estoy bastante seguro de que el método de frecuencia estática en Colecciones sería útil aquí:
Así es como lo haría de todos modos. Estoy bastante seguro de que esto es jdk 1.6 directamente.
fuente
En Java 8:
fuente
Collections.frequency()
? Parece menos legible.Esto muestra por qué es importante " Referirse a los objetos por sus interfaces " como se describe en el libro Effective Java .
Si codifica la implementación y usa ArrayList en, digamos, 50 lugares en su código, cuando encuentre una buena implementación de "Lista" que cuente los elementos, tendrá que cambiar todos esos 50 lugares, y probablemente tendrá que rompa su código (si solo lo usa usted, no es gran cosa, pero si alguien más lo usa, también romperá su código)
Al programar en la interfaz, puede dejar esos 50 lugares sin cambios y reemplazar la implementación de ArrayList a "CountItemsList" (por ejemplo) o alguna otra clase.
A continuación se muestra una muestra muy básica sobre cómo se podría escribir esto. Esto es solo una muestra, una lista lista para producción sería mucho más complicada.
Principios de OO aplicados aquí: herencia, polimorfismo, abstracción, encapsulación.
fuente
Lo sentimos, no hay una llamada a un método simple que pueda hacerlo. Sin embargo, todo lo que debe hacer es crear un mapa y contar la frecuencia con él.
fuente
No hay un método nativo en Java para hacer eso por usted. Sin embargo, puede usar IterableUtils # countMatches () de Apache Commons-Collections para hacerlo por usted.
fuente
En realidad, la clase Colecciones tiene un método estático llamado: frecuencia (Colección c, Objeto o) que devuelve el número de ocurrencias del elemento que está buscando, por cierto, esto funcionará perfectamente para usted:
fuente
Solución alternativa de Java 8 usando Streams :
fuente
Me pregunto por qué no puedes usar esa API de Google Collection con JDK 1.6. ¿Eso lo dice? Creo que puede, no debería haber problemas de compatibilidad, ya que está diseñado para una versión inferior. El caso habría sido diferente si se hubiera creado para 1.6 y está ejecutando 1.5.
¿Me equivoco en alguna parte?
fuente
Un enfoque un poco más eficiente podría ser
fuente
Para obtener las ocurrencias del objeto de la lista directamente:
Para obtener la aparición de la colección Object dentro de la lista, anule el método equals en la clase Object como:
Llame a Colecciones.frecuencia como:
fuente
Manera simple de encontrar la aparición del valor de cadena en una matriz utilizando las características de Java 8.
Salida: {Cat = 2, Goat = 1, Cow = 1, cow = 1, Dog = 1}
Puede notar que "Vaca" y vaca no se consideran como la misma cadena, en caso de que lo requiera con el mismo recuento, use .toLowerCase (). Encuentra el fragmento a continuación para lo mismo.
Salida: {gato = 2, vaca = 2, cabra = 1, perro = 1}
fuente
toString()
es innecesaria. Simplemente puede hacer:duplicateList.stream().collect(Collectors.groupingBy(e -> e,Collectors.counting()));
Lo que quieres es una bolsa, que es como un conjunto pero también cuenta el número de ocurrencias. Desafortunadamente, el marco de colecciones de Java es genial, ya que no tienen una bolsa impl. Para eso hay que usar el texto del enlace Apache Common Collection
fuente
Método 1:
Método 2:
fuente
Si usa Eclipse Collections , puede usar a
Bag
. AMutableBag
puede ser devuelto desde cualquier implementación deRichIterable
mediante una llamadatoBag()
.La
HashBag
implementación en Eclipse Collections está respaldada por aMutableObjectIntMap
.Nota: Soy un committer para Eclipse Collections.
fuente
Coloque los elementos de la lista de arrays en el hashMap para contar la frecuencia.
fuente
Java 8 : otro método
fuente
Así que hazlo a la antigua usanza y hazlo tú mismo:
fuente
Si es usuario de mi DSL de ForEach , puede hacerlo con una
Count
consulta.fuente
No quería hacer este caso más difícil y lo hice con dos iteradores. Tengo un HashMap con Apellido -> Nombre. Y mi método debería eliminar elementos con FirstName debidamente.
fuente
Salida:
fuente
fuente
fuente