【问题标题】:How to check if an Array contains specific term - Android如何检查数组是否包含特定术语 - Android
【发布时间】:2012-04-08 21:07:01
【问题描述】:

我目前有一份声明,内容为

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

我想在 .contains 参数中添加至少几个术语,但是我的印象是在一行中有大量术语是不好的编程习惯。..

我的问题是,有没有更合适的方法来存储我想要在 .contains 参数中拥有的所有值?

谢谢

【问题讨论】:

  • 要回答更大的问题,您能告诉我们。为什么你有一个单词列表以及为什么要检查 4-5 个不同的单词?
  • 参数的更多术语是什么意思?比如,你会搜索整个句子还是什么?
  • @jpom 他的意思是if(Arrays.asList(results).contains("Word") || Arrays.asList(results).contains("Word2") || Arrays.asList(results).contains("Word3"))
  • 假设我有一个足球运动员名单,我想做,if(Arrays.asList(players).contains("tom","selleck","bill"));我也是在意识到您不能在 .contains() 中放置 OR 运算符之后...

标签: android arrays list search contains


【解决方案1】:

您可以使用两个列表的交集:

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

不过,为了提高性能,最好使用两个 HashSets 的交集:

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 中。要检查所有项是否出现在结果中,您只需确保交集的大小与您的项列表的大小相同:

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

【讨论】:

  • 我现在正在尝试这种方法,但是我收到“无法在原始类型布尔值上调用 size()”错误
  • 糟糕。你说的对。方法retainAll 更改原始集合并返回一个布尔值。我编辑了答案来解决这个问题。
  • 创建一个临时的Set对象真的没必要。
【解决方案2】:

您可以使用 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);
}

请注意,此特定代码示例将在 foundWordInResults 中包含 true,因为“dog”在 resultswordsWeAreLookingFor 中都存在。

【讨论】:

    【解决方案3】:

    为什么不将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;
           }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2020-07-15
      相关资源
      最近更新 更多