2016-11-16 44 views
1

基本上我循環遍歷每個數組中的每個元素,試圖找到一個元素也是另一個數組中的元素,如果有一個元素在另一個數組中重複,我想打印出該元素以及停止循環。 在簡單的話,這是我有:如何檢查數組中的元素是否在另一個數組中重複。所有這些數組都在多維數組中?

def list = [[2,3,5,10,13], [12,23,9,8], [34,11,14,15,67,28,5], [7,23,67,27,30,33]] 

重要:一個元素永遠不會出現兩次在同一陣列中

我需要遍歷每個數組的元素進行比較從其他數組中的其他元素,並且如果有重複的元素(例如:5 - 這個數字在array1和array3中重複)然後我的循環應該停止。我被困在這一段時間。有誰知道如何在Groovy中解決這個問題嗎?提前感謝!

+0

是它的Java呢? – Vadim

+1

@Vadim它的Groovy – HenryDev

回答

0
int[][] list = {{2,3,5,10,13}, {12,23,9,8}, {34,11,14,15,67,28,5}, {7,23,67,27,30,33}}; 
HashSet<Integer> seenItems = new HashSet<>(); 
for(int i = 0; i < list.length; i++) { 
    int[] l = list[i]; 
    for(int j = 0; j < l.length; j++) { 
     int itemToCheck = l[j]; 
     if (seenItems.contains(itemToCheck)) { 
      System.out.println("We've already seen " + itemToCheck); 
      return; 
     } else { 
      seenItems.add(itemToCheck); 
     } 
    } 
} 
+0

你能舉一個列表值的例子嗎? – HenryDev

+0

@HenryDev,已更新 –

+0

非常感謝您的幫助! – HenryDev

1

聲明二維陣

Integer [][]a = {{2,3,5,10,13}, {12,23,9,8}, {34,5,11,14,15}, {7,23,67,27,30,33}}; 

與集

boolean numberFound = false; 
int number=0; 
for (int i = 0; i < a.length && !numberFound; i++){ 
    for (int j = i+1; j < a.length && !numberFound; j++) { 
     HashSet<Integer> intersection = new HashSet<Integer>(Arrays.asList(a[i])); 
     intersection.retainAll(Arrays.asList(a[j])); 
     if(intersection.size()>0){ 
      numberFound = true; 
      number = intersection.iterator().next().intValue(); 
     } 
    } 
} 

之間的交叉尋找數印刷

if(numberFound){ 
    System.out.println("Number found is: " +number); 
} else{ 
    System.out.println("Number not found"); 
} 

UPDATE

如果我們相信,一個元素永遠不會出現兩次在同一陣列中,我們可以使用此代碼:

Entry<Integer, Long> entry = Arrays.stream(a) 
.flatMapToInt(Arrays::stream) 
    .boxed() 
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
     .entrySet() 
     .stream() 
     .filter(s -> s.getValue() > 1) 
      .findAny() 
      .orElse(null); 

if(entry == null){ 
System.out.println("Number not found"); 
}else { 
System.out.println("Number found: " + orElse.getKey()); 
} 
+1

您必須編寫Streams的Groovy實現。在當前的Groovy代碼中,上述Lambdas的使用將不被接受(如果OP使用Groovy源代碼)。您可以用Groovy中的方法指針替換Predicates和Groovy Closures和Java 8方法引用。 – dmahapatro

+1

@dmahapatro我同意你的觀點,我是用java做的,因爲我對這門語言更加熟悉(而且我在這個問題中也看到了java標籤)。無論如何,算法背後的邏輯非常類似於groovy。最後,我投了你的答案,我認爲OP應該接受它,因爲這正是他所期待的。 – user6904265

+1

我敢打賭,你會喜歡Groovy。 Java 8具有很強的功能,但很久以前,Groovy中都已經提供了這些功能。只需看一下http://groovy-lang.org/,並使用Web控制檯https://groovyconsole.appspot.com/來玩遊戲。它和'println'Hello World'一樣簡單;-) – dmahapatro

2
def list = [ 
    [2,3,5,10,13], 
    [12,23,9,8], 
    [34,11,14,15,67,28,5], 
    [7,23,67,27,30,33] 
] 

list.flatten().countBy { it }.findResult { k, v -> v > 1 ? k : null } 
+0

投票。多謝兄弟。 – HenryDev

相關問題