Как проверить, содержит ли массив конкретный термин - Android - PullRequest
5 голосов
/ 24 марта 2012

В настоящее время у меня есть выражение, которое гласит:

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

, и я хочу добавить как минимум еще несколько терминов к параметру .contains, однако у меня сложилось впечатление, что иметь большую практику программированияколичество терминов в одной строке ..

У меня такой вопрос, есть ли более подходящий способ сохранить все значения, которые я хочу иметь в параметрах .contains?

Спасибо

Ответы [ 3 ]

7 голосов
/ 24 марта 2012

Вы можете использовать пересечение двух списков:

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

Для повышения производительности лучше использовать пересечение двух 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
}

В качестве примечания приведенный выше код проверяет, присутствует ли ЛЮБОЙ терминов в results. Чтобы проверить, что ALL условия появляются в результатах, вы просто должны убедиться, что пересечение имеет тот же размер, что и ваш список терминов:

 resultsSet.retainAll(termSet);
 if(resultSet.size() == termSet.size())
1 голос
/ 24 марта 2012

Вы можете использовать Android java.util.Collections класс, чтобы помочь вам с этим. В частности, будет полезно disjoint:

Возвращает, если в указанных коллекциях нет общих элементов.

Вот пример кода, с которого стоит начать.

В своей Деятельности или везде, где вы проверяете, есть ли в ваших результатах слово, которое вы ищете:

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

Также у вас в том же классе или, возможно, в служебном классе:

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

Обратите внимание, что этот конкретный пример кода будет содержать true в foundWordInResults, так как "dog" присутствует в results и wordsWeAreLookingFor.

0 голосов
/ 24 марта 2012

Почему бы вам просто не сохранить свой results в HashSet? С HashSet вы можете извлечь выгоду из хеширования ключей, и это сделает ваше утверждение намного быстрее.

Arrays.asList(results).contains("Word") создает временный объект List каждый раз, только чтобы выполнить линейный поиск, это неэффективное использование памяти и медленное.

Есть метод HashSet.containsAll(Collection collection), который вы можете использовать, чтобы делать то, что вы хотите, но опять же, это неэффективное использование памяти, если вы хотите создать временный список параметров просто для того, чтобы сделать утверждение.

Я предлагаю следующее:

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