0

我有一个元素列表(在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++;
}

“问题”是,我不太喜欢它。你知道一些更优雅/更简单的解决方案吗?谢谢

4

2 回答 2

4

仅将外部循环编写为“传统” forfor (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);
   }
}

这很清楚——但当然,gettingei可以提升到外部循环,代价是代码变得不太清晰。

于 2013-05-08T01:19:09.710 回答
0

我找到了一个可以为您执行此操作的库

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
于 2013-05-08T01:26:09.257 回答