在Java中生成没有冗余的所有场所组合

时间:2015-09-27 21:19:30

标签: java algorithm list combinations guava

我想要一个算法来显示所有可能的组合。一个人不能同时在几个工作岗位上工作。在下面的例子中,如果只有5个人和3个工作。所以有5个X 4 X 3组合,所以60个组合。解决方案应该用Java完成。我可以使用Guava库。我看起来特别好的开发实践(不仅仅是解决方案)。

IN:

John,Peter,Dylan,Bryan,Pharell和Job A,Job B,Job C

OUT:

Solution 1:
Job A: John
Job B: Peter
Job C: Dylan

Solution 2:
Job A: Pharell
Job B: John
Job C: Peter

Solution 3:
Job A: John
Job B: Pharell
Job C: Peter

...

Solution 60:
Job A: John
Job B: Pharell
Job C: Bryan

1 个答案:

答案 0 :(得分:1)

在这里,您可以看到基于amit's answer的子集和guava - Collections2的排列解决方案:

import com.google.common.collect.Collections2;

import java.util.*;

public class Test {
    private static void getSubsets(List<String> superSet, int idx, Set<String> current, List solution) {
        if (current.size() == 3) {
            solution.add(new HashSet<>(current));
            return;
        }
        if (idx == superSet.size()) {
            return;
        }
        String x = superSet.get(idx);
        current.add(x);
        getSubsets(superSet, idx + 1, current, solution);
        current.remove(x);
        getSubsets(superSet, idx + 1, current, solution);
    }

    public static List<Set<Integer>> getSubsets(List<String> superSet) {
        List res = new ArrayList<>();
        getSubsets(superSet, 0, new HashSet<>(), res);
        return res;
    }

    public static void main(String[] args) {
        List<String> initialSet = new ArrayList<String>() {{
            add("John");
            add("Peter");
            add("Dylan");
            add("Bryan");
            add("Pharell");
        }};
        List<Set<Integer>> subsets = getSubsets(initialSet);
        int counter = 1;
        for (Set s : subsets) {
            Collection<List<String>> results = Collections2.permutations(s);
            for (List<String> words : results) {
                System.out.println("Solution " + counter++);
                System.out.println("Job A: " + words.get(0));
                System.out.println("Job B: " + words.get(1));
                System.out.println("Job C: " + words.get(2));
                System.out.println();
            }
        }
    }
}

因此,由于您始终按此顺序拥有A,B和C,因此在实施过程中会忽略它们。只有在打印输出时才能看到它们。因此,问题变为:找到5元素集的所有3元素排列。

首先,为5个元素集生成了所有3个元素集,然后每个获得的集合被置换。