Cómo comprobar si un Array contiene un término específico – Android

Actualmente tengo una declaración que lee

if(Arrays.asList(results).contains("Word")); 

Y quiero agregar al menos varios términos más al parámetro .contains sin embargo estoy bajo la impresión de que es mala práctica de programación tener un gran número de términos en una línea ..

Mi pregunta es, ¿hay una forma más adecuada para almacenar todos los valores que quiero tener en los parámetros .contains?

Gracias

Puede utilizar la intersección de dos listas:

 String[] terms = {"Word", "Foo", "Bar"}; List<String> resultList = Arrays.asList(results); resultList.retainAll(Arrays.asList(terms)) if(resultList.size() > 0) { /// Do something } 

Para mejorar el rendimiento sin embargo, es mejor utilizar la intersección de dos HashSet s:

 String[] terms = {"Word", "Foo", "Bar"}; Set<String> termSet = new HashSet<String>(Arrays.asList(terms)); Set<String> resultsSet = new HashSet<String>(Arrays.asList(results)); resultsSet.retainAll(termSet); if(resultsSet.size() > 0) { /// Do something } 

Como nota lateral, el código anterior comprueba si CUALQUIERA de los términos aparecen en los results . Para comprobar que TODOS los términos aparecen en los resultados, simplemente asegúrese de que la intersección es del mismo tamaño que su lista de términos:

  resultsSet.retainAll(termSet); if(resultSet.size() == termSet.size()) 

Puede utilizar la clase java.util.Collections de Android para ayudarle con esto. En particular, será útil el disjoint :

Devuelve si las colecciones especificadas no tienen elementos en común.

Aquí hay un ejemplo de código que debe empezar.

En su Actividad o dondequiera que esté comprobando para ver si sus resultados contienen una palabra que usted está buscando:

  String[] results = {"dog", "cat"}; String[] wordsWeAreLookingFor = {"foo", "dog"}; boolean foundWordInResults = this.checkIfArrayContainsAnyStringsInAnotherArray(results, wordsWeAreLookingFor); Log.d("MyActivity", "foundWordInResults:" + foundWordInResults); 

También en su la misma clase, o tal vez una clase de utilidad:

 private boolean checkIfArrayContainsAnyStringsInAnotherArray(String[] results, String[] wordsWeAreLookingFor) { List<String> resultsList = Arrays.asList(results); List<String> wordsWeAreLookingForList = Arrays.asList(wordsWeAreLookingFor); return !Collections.disjoint(resultsList, wordsWeAreLookingForList); } 

Tenga en cuenta que este ejemplo de código en particular tendrá que contener verdadero en foundWordInResults ya que "perro" está en ambos results y wordsWeAreLookingFor .

¿Por qué no acaba de almacenar sus results en un HashSet ? Con un HashSet, usted puede beneficiarse del hashing de las llaves, y hará su aserción mucho más rápido.

Arrays.asList(results).contains("Word") crea un objeto List temporal cada vez sólo para hacer una búsqueda lineal, no es un uso eficiente de la memoria y es lento.

Hay un HashSet.containsAll(Collection collection) que puedes usar para hacer lo que quieres, pero de nuevo, no es un uso eficiente de la memoria si quieres crear una lista temporal de los parámetros sólo para hacer una aserción.

Sugiero lo siguiente:

 HashSet hashSet = .... public assertSomething(String[] params) { for(String s : params) { if(hashSet.contains(s)) { // do something break; } } } 
  • Iconos en un diálogo de lista
  • Android: Cómo deshabilitar los elementos de la lista en la creación de la lista
  • ¿Cómo declarar la lista?
  • TreeMap a ArrayList Java
  • Reordenación de listas como listas de reproducción en el reproductor multimedia
  • cómo eliminar datos particulares de ArrayList <Integer> en android
  • Obtener la lista de lugares WiFi disponibles
  • ¿Trabajando sobre las propiedades de los objetos en una lista?
  • ListView cambiar el texto en el elemento de clic
  • ¿Cómo obtener una lista de servicios en ejecución en Android?
  • Diálogo de lista personalizada de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.