2016-11-16 45 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

相关问题