2012-03-24 1 views
5

я в настоящее время есть заявление, которое гласитКак проверить, если массив содержит специфический термин - Android

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

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

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

Благодаря

+0

Чтобы ответить на больший вопрос, не могли бы вы нам рассказать. Почему у вас есть список слов и почему вы хотите проверить 4-5 разных? – Blundell

+0

Что вы подразумеваете под термином параметр? Например, вы бы искали целое предложение или что? – jpm

+1

@jpom он означает 'if (Arrays.asList (results) .contains (" Word ") || Arrays.asList (results) .contains (" Word2 ") || Arrays.asList (results) .contains (" Word3 ")) ' – Blundell

ответ

7

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

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

Для повышения производительности, хотя, это лучше использовать пересечение двух HashSet с:

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 
} 

В качестве примечания, приведенный выше код проверяет, ANY условий отображаются в results. Для того, чтобы проверить, что ALL термины появляются в результатах поиска, вы просто убедитесь, что пересечение имеет такой же размер, как ваш термин списка:

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

Теперь я пытаюсь использовать этот метод, но я получаю сообщение «Невозможно вызывать размер() для примитивного типа boolean» error – TomSelleck

+0

К сожалению. Ты прав. Метод 'keepAll' изменяет исходную коллекцию и возвращает логическое значение. Я отредактировал ответ, чтобы исправить это. – Diego

+0

Нет необходимости создавать временный объект Set. – neevek

0

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

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

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

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

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

Вы можете использовать java.util.Collections класс Android, чтобы помочь вам в этом. В частности, будет полезно использовать 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, так как «собака» находится в обоих results и wordsWeAreLookingFor.