Java / Groovy为声明问题加倍

时间:2011-05-25 15:11:24

标签: java groovy

这是一个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的简单“休息”会做到吗?

6 个答案:

答案 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 }