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 ..
- Lista sin fin de Android
- Rellenar listview de arraylist de objetos
- Android - Inflando ListView
- EditText llama aFocusChanged tres veces en vez de una vez
- Inflar una vista varias veces en el mismo padre cuando se hace clic en un botón
Mi pregunta es, ¿hay una forma más adecuada para almacenar todos los valores que quiero tener en los parámetros .contains?
Gracias
- Lista de comparación <String >
- Obtener la lista de contactos pertenecientes a un grupo específico
- ExpandableListView no reacciona y recibe ningún clic
- Cómo eliminar elementos de una lista con gesto de desplazamiento como en gmail
- Cómo mostrar la lista de alertas de notificación una por una de la actividad?
- ¿Cómo inicio un intento de un OnClickListener
- Lista de guardar de Android <String>
- Android: Cómo ocultar un elemento ListView
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; } } }