我需要迭代两个元素的所有组合:在集合[1,2,3,4]中我想迭代[(1,2),(1,3),(1,4), (2,3),(2,4),(3,4)]。是否有现成的工具?
// Not what I need, works wrong!
for (Object o1 : set) {
for (Object o2 : set) {
if (o1 == o2) continue;
...
}
}
此代码将执行比所需操作多两倍的操作,因为将在两个循环中访问每个对象。
为此编写我自己的方法是微不足道的,我只是不想发明轮子。我希望在Guava或Collections API中找到它,但没有找到这样的功能。
答案 0 :(得分:2)
https://code.google.com/p/combinatoricslib/ 简单组合部分说明了此实用程序的用法。 与2个元素的组合将产生你想要的东西。
// Create the initial vector
ICombinatoricsVector<String> initialVector = Factory.createVector(
new String[] { "red", "black", "white", "green", "blue" } );
// Create a simple combination generator to generate 3-combinations of the initial vector
Generator<String> gen = Factory.createSimpleCombinationGenerator(initialVector, 3);
// Print all possible combinations
for (ICombinatoricsVector<String> combination : gen) {
System.out.println(combination);
}
答案 1 :(得分:1)
我不确定您要使用哪个Set,但如果它具有随机访问权限,那么如果您可以明确要求位置i
中的成员,那么您可以使用双for
随着第二个迭代器逐渐增加:
e.g。
for(i = 0; i < Set1_size; i++)
for(j = i; j < Set1_size; i++)
{ o1.get(i).equals(o2); }
通过这种方式,你只需要循环一半(实际上是你的主对角线的一半)以前的比较。
答案 2 :(得分:1)
continue
替换break
几乎可以做到你想要的:它不产生交换对。它也减少了开销(你不关心它)。
您只需要交换o1
和o2
的名称即可准确获得所需的对。
正如评论中指出的那样,Set
没有迭代订单保证。因此,请务必事先将Set
转换为List
。对于大集合,这比配对本身便宜得多(O(n)
vs O(n*n)
)。