与名单上的夫妻一起工作,忽略秩序......一些优雅的方式?

时间:2013-05-08 01:17:11

标签: java collections arraylist iteration

我有一个元素列表(在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;是的,我不太喜欢它。你知道一些更优雅/更简单的解决方案吗? 感谢

2 个答案:

答案 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