在2D数组中循环一次3个项目(Java)

在2D数组中循环一次3个项目(Java),java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,我很难找到一种方法在二维数组中一次移动3个项目,主要是因为它必须以特定的方式完成 数组本身具有作为行的个体和作为列的轨迹。我必须一次拿两个人,每三个人比较一次,直到最后: So if there are 5 individuals the total individual comparisons would be 0,1,2, 0,1,3, 0,1,4, 1,2,3, 1,2,4 and 2,3,4 对于这些比较中的每一个,我必须比较它们在每个位点上的等位基因(每列代表一个等位基因,所以两列代

我很难找到一种方法在二维数组中一次移动3个项目,主要是因为它必须以特定的方式完成

数组本身具有作为行的个体和作为列的轨迹。我必须一次拿两个人,每三个人比较一次,直到最后:

So if there are 5 individuals the total individual comparisons would be
0,1,2, 0,1,3, 0,1,4, 1,2,3, 1,2,4 and 2,3,4
对于这些比较中的每一个,我必须比较它们在每个位点上的等位基因(每列代表一个等位基因,所以两列代表一个位点)。看起来是这样的

   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.
对于每一组6个等位基因,我都要做一个比较。我已经完成了比较测试的代码。我只是不知道如何正确地循环通过这个2D阵列。我想的是psuedo代码如下:

 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
我不想直接回答。我只想知道如何解决这个问题,并牢记数组边界。我以前从未做过这样的搜索


谢谢你的帮助!谢谢:)

我可以想到两种方法。现在,我们有经典的外部迭代,还有更现代(但稍微有限)的内部流迭代。我给你们两个看

我假设你的集合/数组是
等位基因
类型,称为
等位基因
,但这完全是任意的

对于外部迭代,应该是这样的:

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)
        )
    )
);
在这个例子中,它可能更有效一些,因为
过滤器(…)
方法在开始迭代之前会删除每个潜在的冲突。但是,如果您要处理的问题远远不止三个,那么您可能需要对迭代进行巧妙处理


希望这样就可以了。祝你好运

如果不是等位基因类型,而是位置上有一个简单的整数值,那么第一种方法也应该有效。似乎第一种方法是完全忽略轨迹,而只是比较数值。这是真的,还是我判断错了?我承认我对基因座的概念并不完全清楚。基因座只是被测试动物的基因组成。在每个基因座上都有一个来自母亲的等位基因和一个来自父亲的等位基因。在这里,我试图通过将每个等位基因作为一个整数放在它自己的数组索引中来简化它。因此,如果有5个个体,每个个体有3个基因座,那么每个个体有6个等位基因,总共有30个等位基因。