2012-03-24 7 views
5

Im Moment habe ich eine Erklärung, dieWie um zu überprüfen, ob ein Array bestimmten Begriff enthält - Android

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

liest und ich möchte aber bin ich unter dem Eindruck, zumindest einige weitere Begriffe auf den .contains Parameter hinzuzufügen, die es ist eine schlechte Programmierpraxis, eine große Anzahl von Termen in einer Zeile zu haben.

Meine Frage ist, gibt es eine geeignetere Möglichkeit, alle Werte zu speichern, die ich in den .contains-Parametern haben möchte?

Dank

+0

die größere Frage zu beantworten, können Sie uns sagen. Warum hast du eine Liste von Wörtern und warum willst du nach 4-5 verschiedenen suchen? – Blundell

+0

Was meinst du mehr Begriffe für den Parameter? Wie würden Sie nach einem ganzen Satz suchen oder was? – jpm

+1

@jpom er bedeutet 'if (Arrays.asList (Ergebnisse) .contains ("Wort") || Arrays.asList (Ergebnisse) .contains ("Wort2") || Arrays.asList (Ergebnisse) .contains ("Wort3")) ' – Blundell

Antwort

7

Sie können Schnittpunkt von zwei Listen verwenden:

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

Leistung zu verbessern ist es allerdings besser, die Kreuzung von zwei HashSet s zu verwenden:

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 
} 

Als eine Randnotiz überprüft der obige Code, ob ANY der Begriffe erscheinen in results. Um zu überprüfen, dass ALL die Begriffe in den Ergebnissen angezeigt wird, stellen Sie einfach sicher, dass der Schnittpunkt die gleiche Größe wie Ihre Wortliste ist:

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

Ich versuche diese Methode jetzt aber ich bekomme eine "Kann nicht aufrufen, Größe() auf den primitiven Typ boolean" Fehler – TomSelleck

+0

Hoppla. Du hast recht. Die Methode 'retainAll' ändert die ursprüngliche Sammlung und gibt einen booleschen Wert zurück. Ich habe die Antwort bearbeitet, um das Problem zu beheben. – Diego

+0

Es ist wirklich nicht notwendig, ein temporäres Set-Objekt zu erstellen. – neevek

0

Warum speichern Sie nicht nur Ihre results in ein HashSet? Mit einem HashSet können Sie von Hashing der Schlüssel profitieren, und es wird Ihre Behauptung viel schneller machen.

Arrays.asList(results).contains("Word") erstellt jedes Mal ein temporäres List-Objekt, nur um eine lineare Suche durchzuführen, es ist keine effiziente Verwendung von Speicher und es ist langsam.

Es gibt HashSet.containsAll(Collection collection) Methode, die Sie verwenden können, um zu tun, was Sie wollen, aber wieder ist es nicht effizient Speicher verwenden, wenn Sie eine temporäre Liste der Parameter erstellen möchten, nur um eine Assertion zu tun.

Ich schlage vor, die folgenden:

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

Sie nutzen können Android java.util.Collections Klasse, die Sie mit diesem zu helfen. Insbesondere disjoint wird nützlich sein:

Gibt zurück, ob die angegebenen Sammlungen keine Elemente gemeinsam haben.

Hier ist ein Codebeispiel, mit dem Sie beginnen können.

in Ihrer Tätigkeit oder wo auch immer Sie überprüfen, ob Ihre Ergebnisse ein Wort enthalten, die Sie suchen:

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

Auch in Ihrer derselben Klasse, oder vielleicht eine Utility-Klasse:

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

Beachten Sie, dass dieses spezielle Codebeispiel in foundWordInResults True enthalten wird, da "Dog" in results und wordsWeAreLookingFor ist.

Verwandte Themen