繁体   English   中英

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

[英]looping through a 2D array 3 items at a time (Java)

我很难找出一次一次在2D数组中移动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阵列。 我在想的是这样的伪代码:

 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

我不想直接回答。 我只想提供有关如何解决这一问题的指南,请牢记阵列边界。 我以前没有做过这样的搜索。

感谢您的帮助! 谢谢 :)

我可以想到两种方法。 如今,我们拥有经典的外部迭代和更现代(但略有限制)的内部流迭代。 我会给你们看的。

我假设您的集合/数组属于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(…)方法会在开始迭代之前消除每个潜在的冲突。 但是,如果要处理的对象不止三个,那么您可能必须变得更聪明。

希望能做到。 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM