2012-03-24 19 views
5

Actualmente tengo una declaración que dice¿Cómo comprobar si una matriz contiene término específico - Android

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

y quiero añadir al menos varios términos más al parámetro .contains sin embargo estoy bajo la impresión de que es una mala práctica de programación tener una gran cantidad de términos en una línea.

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

Gracias

+0

Para responder a la pregunta más grande, ¿podría decirnos? ¿Por qué tiene una lista de palabras y por qué quiere verificar 4-5 diferentes? – Blundell

+0

¿Qué quiere decir con más términos para el parámetro? Al igual, estarías buscando una oración completa o qué? – jpm

+1

@jpom él quiere decir 'if (Arrays.asList (results) .contains (" Word ") || Arrays.asList (results) .contains (" Word2 ") || Arrays.asList (results) .contains (" Word3 ")) ' – Blundell

Respuesta

7

Usted puede utilizar 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 al margen, el código anterior comprueba si CUALQUIER de los términos aparecen en results. Para comprobar que TODOS los términos aparecen en los resultados, se debe asegurar que la intersección es del mismo tamaño que su lista de términos:

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

Estoy probando este método ahora, pero obtengo un error "No se puede invocar el tamaño() en el tipo primitivo booleano" – TomSelleck

+0

Oops. Tienes razón. El método 'retainAll' cambia la colección original y devuelve un booleano. Edité la respuesta para arreglar esto. – Diego

+0

Realmente no es necesario crear un objeto Set temporal. – neevek

0

¿Por qué no acaba de almacenar su results en un HashSet? Con un HashSet, puede beneficiarse del hash de las claves, y hará su afirmación mucho más rápida.

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

Hay un método HashSet.containsAll(Collection collection) que puede usar para hacer lo que desee, pero nuevamente, no es un uso eficiente de la memoria si desea crear una Lista temporal de los parámetros solo 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; 
     } 
    } 
} 
1

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

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

Aquí hay un ejemplo de código que debería comenzar.

En su actividad o donde sea que usted está mirando para ver si los resultados contienen una palabra que 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 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 particular tendrá contener verdadero en foundWordInResults ya que "perro" está en ambos results y wordsWeAreLookingFor.

Cuestiones relacionadas