我有一个元素列表(在java中),让我们说:
List<Integer> elem = new ArrayList<>();
elem.add(1);
elem.add(2);
elem.add(3);
elem.add(4);
我想完全迭代每对独特的一对(意味着我想要这6对夫妇:1,2; 1,3; 1,4; 2,3; 2,4; 3,4
)
我这样做的方式如下:
int i = 1;
for(Integer a:elem) {
for(int j = i; j<elem.size(); j++) {
Integer b = elem.get(j);
doSomethingWithCouple(a,b);
}
i++;
}
&#34;问题&#34;是的,我不太喜欢它。你知道一些更优雅/更简单的解决方案吗? 感谢
答案 0 :(得分:4)
仅将外部循环写为for (i = 0; i < elems.size(); i++)
循环的“传统”。
for (i = 0; i < elems.size(); i++) {
for (j = i+1; j < elems.size(); j++) {
int ei = elems.get( i);
int ej = elems.get( j);
doSomethingWith( ei, ej);
}
}
这非常清晰 - 当然,获取ei
可能会被提升到外部循环,代价是代码变得不那么清晰了。
答案 1 :(得分:0)
I found a library that will do this for you:
package com.sandbox;
import org.paukov.combinatorics.Factory;
import org.paukov.combinatorics.Generator;
import org.paukov.combinatorics.ICombinatoricsVector;
public class Sandbox {
public static void main(String[] args) {
// Create the initial vector
ICombinatoricsVector<Integer> initialVector = Factory.createVector(
new Integer[]{1, 2, 3, 4});
// Create a simple combination generator to generate 3-combinations of the initial vector
Generator<Integer> gen = Factory.createSimpleCombinationGenerator(initialVector, 2);
// Print all possible combinations
for (ICombinatoricsVector<Integer> combination : gen) {
System.out.println(combination.getValue(0) + " " + combination.getValue(1));
}
}
}
输出:
1 2
1 3
1 4
2 3
2 4
3 4