2011-05-25 28 views
0

這是一個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]。載有(searchLista [J]。)」,布爾變量測試變得真實和明年我想跳出兩者。在## s的地方有一個簡單的'break'會做到嗎?

回答

2

(你是想故意錯過了兩個列表的最後一個元素,順便?)

正常break聲明僅是退出內環。

如果你想打破兩個層面,有三個常用選項:

  • 使病情爲外環的東西,你可以在身上作虛假
  • 使整個循環的方法,而剛剛從它返回
  • 使用休息帶標籤的最後一個選項的

例子:

// Code before loop 
outerLoop: 
for (...) { 
    for (...) { 
     if (...) { 
      break outerLoop; 
     } 
    } 
} 

就我個人而言,我不經常使用標籤 - 如果可能的話,我寧願使用「使整個雙循環成爲方法」選項。

+0

標籤是非常類似於'goto',而我們都知道,「goto語句是有害的」 – 2011-05-25 15:20:29

+0

(同時也是「‘goto語句是有害的’有害」等):) @邁克爾:我認爲它幾乎不像goto一樣武斷......但我仍然更喜歡更簡單的方法。 – 2011-05-25 15:21:08

+0

「去聲明考慮非常方便,當使用少量和適當」只是不是很吸引人我猜 – 2011-05-25 15:38:27

0

一個簡單的休息只會打破內循環。 但你可以在自己的函數中做這件事,並在##處添加一個return語句。

1

簡短答案是否定 - 雖然稍長的答案是「這隻會影響性能,但是,一旦您(最終)退出循環,test仍然是true」,但不正確。

原因是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() 

,這可能會在性能方面也不會太差了。

0

您可以改爲使用org.apache.commons.collections.CollectionUtils.intersection(Collection, Collection)。首先將每個陣列放入Set<String>

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運行上面的代碼,以驗證它的工作原理

+0

+1,一點點比Java簡潔; - ) – virtualeyes 2011-05-25 15:48:36

0

最簡單的方法來做到這一點用Groovy是:

lista.any { it in searchLista }