这是一个Java / Groovy问题,我正在执行此功能,以在我的网站中的搜索机制中实现。我有两个清单:
String [] lista = temp.split() // ignore the temp part
String [] searchLista = search.split() // ignore the search part
基本上,列表是这样的:
lista = {a, b, c, d}
searchLista= {a, b, a, d}
boolean test
我想验证列表'lista'上的任何元素是否与'searchLista'相同。为此,我做了以下功能:
for(int i = 0; i< lista.length-1; i++){
for(int j = 0; j< searchLista.length-1; j++) {
if(lista[i].contains(searchLista[j])){
test = true
##
}
}
}
我的问题是,如果这个验证是真的:'lista [i] .contains(searchLista [j])',布尔变量测试变为真,接下来我想跳到两个fors之外。代替## s的简单“休息”会做到吗?
答案 0 :(得分:2)
(顺便说一下,你故意错过两个名单的最后一个元素吗?)
正常break
语句只会退出内循环。
如果你想打破两个级别,有三个常见选项:
最后一个选项的示例:
// Code before loop
outerLoop:
for (...) {
for (...) {
if (...) {
break outerLoop;
}
}
}
我个人不经常使用标签 - 如果可能的话,我宁愿使用“将整个双循环作为方法”选项。
答案 1 :(得分:2)
如果您只是想知道2个数组是否有任何共同的元素,那么Groovyiest的方法是:
boolean haveElementsInCommon(array, otherArray) {
!array.toList().disjoint(otherArray.toList())
}
以下是上述功能/方法的一些测试
// create some test data
String[] list1 = [1,2,3,4]
String[] list2 = [5,6,7,8]
String[] list3 = [8,9,10,11]
// test the function works for arrays with nothing in common
assert !haveElementsInCommon(list1, list2)
// test the function works for arrays with at least one element in common
assert haveElementsInCommon(list2, list3)
您可以在Groovy Console中运行上面的代码以验证其是否有效
答案 2 :(得分:1)
简短的答案是否定的 - 尽管稍长的答案是“这只会影响性能,但不正确,因为test
一旦你(最终)退出循环”仍然是true
。“ / p>
原因是break
仅突破了直接封闭的循环。在这种情况下,你有双嵌套循环,并希望打破它们。一种方法是使用标签:
OUTER: for(int i = 0; i< lista.length-1; i++){
for(int j = 0; j< searchLista.length-1; j++) {
if(lista[i].contains(searchLista[j])){
test = true
break OUTER;
}
}
}
其他替代方案是将外循环上的条件更改为i < l;ista.length - 1 && !test
,或者将其全部包装到一个函数中,您只需return
即可。
因为它是Groovy然而,我认为有一种Groovier方法(懒惰地)计算两组的交集 - 此时你可以只测试交集是否为空(这就是你'真的在这之后)。写
时肯定更清晰test = !intersection(lista, searchLista).isEmpty()
这也可能在性能方面也不差。
答案 3 :(得分:0)
一个简单的中断只会破坏内部for循环。 但你可以在自己的函数中执行此操作,并在##。
添加一个return语句答案 4 :(得分:0)
您可以使用org.apache.commons.collections.CollectionUtils.intersection(Collection, Collection)
代替。首先将每个数组放入Set<String>
。
答案 5 :(得分:0)
使用Groovy执行此操作的最简单方法是:
lista.any { it in searchLista }