[英]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.