循环遍历2D数组一次3个项目(Java)

时间:2015-06-01 02:54:27

标签: java arrays multidimensional-array

我很难找到一种方法来同时移动2D数组3项,主要是因为它必须以特定的方式完成。

数组本身具有列的行和列的个体。我必须一次带2个人,并将它们与每三个人进行比较直到结束:

   locus1 locus2 locus3 ...  
   0  1   2  3   4  5 
 0 1  2   3  4   5  6 
 1 7  8   9  10  11 12
 2 13 14  15 16  17 18 
 3 19 20  21 22  23 24
 4 25 26  27 28  29 30 

As a definite example of what I mean, say I have the first set: 0,1,2. 
The first comparison would be of the alleles: 1,2, 7,8 and 13, 14. 
The next comparison would be of the alleles: 3,4, 9,10 and 15,16.
The last (assuming three loci) would be: 5,6, 11,12, and 17,18.

对于这些比较中的每一个,我必须比较每个基因座的等位基因(每列代表一个等位基因,因此两列是一个基因座)。所以它看起来像这样

 for each pair of individuals (i,j)
   for each locus l 
     for each individual k, not i or j
       if comparison test works 
         great
       else 
         better luck next time

对于每组6个等位基因,我必须进行比较。我已经完成了比较测试的代码。我只是不确定如何正确循环这个2D数组。我在想的是像这样的伪代码:

.btn-3da:after {
 z-index:1;
}

.btn-3da:hover {
  position:relative;
  z-index:2;
}

我不想直接回答。我只想指导如何解决这个问题,以保持阵列边界。我之前没有做过这样的搜索。

我感谢任何帮助!谢谢:))

1 个答案:

答案 0 :(得分:0)

我能想到有两种方法可以做到这一点。这些天,我们有经典的外部迭代,以及更现代(但略有限制)的内部流迭代。我会告诉你们两个。

我假设您的集合/数组属于Allele类型且名为alleles,但这完全是任意的。

对于外部迭代,它将是这样的:

for(Allele i : alleles) {
    for(Allele j : alleles) {
        if(i == j) continue;
        for(Allele k : alleles) {
            if(i == j || i == k) continue;
            doComparison(i, j, k);
        }
    }
}

基本上,在进入下一个循环之前测试等效性,如果找到,则跳到下一个条目。

对于内部迭代(功能/流),它将是这样的

alleles.stream().forEach(i -> 
    alleles.stream().filter(j -> i != j).forEach(j -> 
        alleles.stream().filter(k -> k != i && k != j).forEach(k -> 
            doComparison(i, j, k)
        )
    )
);

在这种情况下,它可能会更有效,因为filter(…)方法在开始迭代之前消除了每个潜在的冲突。但是,如果你处理超过三个,你可能必须聪明地进行迭代。

希望能做到这一点。祝你好运!