我目前有一个读取
的声明if(Arrays.asList(results).contains("Word"));
我想在.contains参数中添加至少几个术语,但我认为在一行上有大量术语是不好的编程习惯。
我的问题是,是否有更合适的方法来存储我想要的.contains参数中的所有值?
由于
答案 0 :(得分:7)
您可以使用两个列表的交集:
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
}
作为旁注,上述代码会检查{em> ANY 是否出现在results
中。要检查结果中是否显示 ALL ,您只需确保交叉点与期限列表的大小相同:
resultsSet.retainAll(termSet);
if(resultSet.size() == termSet.size())
答案 1 :(得分:1)
您可以使用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”同时包含results
和wordsWeAreLookingFor
。
答案 2 :(得分:0)
为什么不将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;
}
}
}