迭代所有独特的双元素组合

时间:2014-05-09 10:27:05

标签: java guava

我需要迭代两个元素的所有组合:在集合[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中找到它,但没有找到这样的功能。

3 个答案:

答案 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几乎可以做到你想要的:它不产生交换对。它也减少了开销(你不关心它)。

您只需要交换o1o2的名称即可准确获得所需的对。


正如评论中指出的那样,Set没有迭代订单保证。因此,请务必事先将Set转换为List。对于大集合,这比配对本身便宜得多(O(n) vs O(n*n))。