2012-03-24 10 views
5

Al momento ho un comunicato in cui si leggeCome verificare se un array contiene termine specifico - Android

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

e voglio aggiungere almeno diversi altri termini per il parametro .contains però ho l'impressione che è una cattiva pratica di programmazione avere un gran numero di termini su una riga.

La mia domanda è, c'è un modo più adatto per memorizzare tutti i valori che voglio avere nei parametri .contains?

Grazie

+0

Per rispondere alla domanda più grande, potresti dircelo. Perché hai una lista di parole e perché vuoi controllare per 4-5 diversi? – Blundell

+0

Cosa intendi con più termini del parametro? Tipo, staresti cercando una frase intera o cosa? – jpm

+1

@jpom indica "if (Arrays.asList (results) .contains (" Word ") || Arrays.asList (results) .contains (" Word2 ") || Arrays.asList (results) .contains (" Word3 ")) ' – Blundell

risposta

7

È possibile utilizzare intersezione di due liste:

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

Per migliorare le prestazioni, però, è meglio usare l'intersezione di due 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 
} 

Come nota a margine, il codice sopra controlla se QUALSIASI dei termini visualizzati in results. Per verificare che TUTTI i termini appaiono nei risultati, è sufficiente assicurarsi che l'incrocio è la stessa dimensione come l'elenco termine:

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

Sto provando questo metodo ora tuttavia sto ottenendo un errore "Impossibile richiamare size() sul tipo primitivo booleano" – TomSelleck

+0

Ops. Hai ragione. Il metodo 'retainAll' cambia la collezione originale e restituisce un valore booleano. Ho modificato la risposta per risolvere questo problema. – Diego

+0

Non è davvero necessario creare un oggetto Set temporaneo. – neevek

0

Perché non basta memorizzare il vostro results in un HashSet? Con un HashSet, puoi trarre vantaggio dall'hashing dei tasti, e renderà la tua affermazione molto più veloce.

Arrays.asList(results).contains("Word") crea un oggetto Elenco temporaneo ogni volta solo per eseguire la ricerca lineare, non è un uso efficiente della memoria ed è lento.

C'è il metodo HashSet.containsAll(Collection collection) che è possibile utilizzare per fare ciò che si desidera, ma, ancora una volta, non è un uso efficiente della memoria se si desidera creare un elenco temporaneo dei parametri solo per eseguire un'asserzione.

suggerisco il seguente:

HashSet hashSet = .... 
public assertSomething(String[] params) { 
    for(String s : params) { 
     if(hashSet.contains(s)) { 
      // do something 
      break; 
     } 
    } 
} 
1

Si può utilizzare java.util.Collections classe di Android per aiutarvi con questo. In particolare, disjoint sarà utile:

Restituisce se le raccolte specificate non hanno elementi in comune.

Ecco un esempio di codice che dovrebbe iniziare.

nella vostra attività o dove si sta verificando per vedere se i risultati contengono una parola che si sta cercando:

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

Anche nella stessa classe, o forse una classe di utilità:

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

Si noti che questo particolare esempio di codice conterrà true in foundWordInResults poiché "dog" è in entrambi results e wordsWeAreLookingFor.

Problemi correlati