2012-03-24 13 views
5

Obecnie mam oświadczenie, które brzmiJak sprawdzić, jeśli tablica zawiera konkretny termin - Android

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

i chcę dodać co najmniej jeszcze kilka pojęć z parametrem .contains jednak jestem pod wrażeniem, że Złą praktyką programistyczną jest posiadanie dużej liczby terminów w jednym wierszu ..

Moje pytanie brzmi, czy istnieje lepszy sposób przechowywania wszystkich wartości, które chcę mieć w parametrach .contains?

Dzięki

+0

Aby odpowiedzieć na większe pytanie, możesz nam powiedzieć. Dlaczego masz listę słów i dlaczego chcesz sprawdzić 4-5 różnych? – Blundell

+0

Co masz na myśli, mówiąc więcej parametrów? Chcesz znaleźć całe zdanie lub coś innego? – jpm

+1

@jpom ma na myśli 'if (Arrays.asList (wyniki) .contains (" Word ") || Arrays.asList (wyniki) .contains (" Word2 ") || Arrays.asList (wyniki) .contains (" Word3 ")) ' – Blundell

Odpowiedz

7

Można użyć przecięciu dwóch listach:

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

Aby zwiększyć wydajność mimo, że lepiej korzystać z przecięcia dwóch 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 
} 

Na marginesie powyższy kod sprawdza, czy KAŻDY warunków pojawia się w results. Aby sprawdzić, czy ALL określenia pojawiają się w wynikach, po prostu upewnij się, że skrzyżowanie jest taki sam rozmiar jak listy wyrażenia:

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

Próbuję tej metody teraz jednak otrzymuję "Nie można wywołać size() na typ pierwotny boolean" błąd – TomSelleck

+0

Ups. Masz rację. Metoda 'retainAll' zmienia oryginalną kolekcję i zwraca wartość logiczną. Poprawiłem odpowiedź, aby to naprawić. – Diego

+0

Naprawdę nie jest konieczne tworzenie tymczasowego obiektu zestawu. – neevek

0

Dlaczego nie można po prostu zapisać swoje results w sposób HashSet? Dzięki HashSet możesz korzystać z funkcji mieszania kluczy, co znacznie przyspieszy twoje twierdzenie.

Arrays.asList(results).contains("Word") tworzy tymczasowy obiekt listy za każdym razem tylko do wyszukiwania liniowego, nie jest wydajne wykorzystanie pamięci i jest powolny.

Istnieje metoda, której można użyć do robienia tego, co chcesz, ale znowu, nie jest wydajne wykorzystanie pamięci, jeśli chcesz utworzyć tymczasową listę parametrów tylko do zapewnienia asercji.

Proponuję następujące:

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

Można wykorzystać java.util.Collections klasę Androida, które pomogą Ci w tym. W szczególności użyteczne będzie: disjoint:

Powoduje, czy określone kolekcje nie mają wspólnych elementów.

Oto przykład kodu, który powinien zacząć.

W swojej działalności lub gdziekolwiek jesteś sprawdzając, czy wyniki zawierają słowo, którego szukasz:

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

Również w Twoim tej samej klasy, a może klasie użytkowej:

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

Należy zauważyć, że ta konkretna próbka kodu będzie zawierała wartość true w foundWordInResults, ponieważ "pies" jest zarówno w postaci results, jak i wordsWeAreLookingFor.

Powiązane problemy