生成长度为< = 5的String数组子集

时间:2015-04-17 11:06:01

标签: java arrays string list arraylist

我在Java中获得了一个String数组。我想生成一个String数组列表,其中包含长度为< = 5的所有String集。例如,如果

String[] s1 = {"a", "b", "c", "d"}

我希望结果为:

List<String[]> s2 = {{"a"}, {"b"}, {"c"}, {"d"}, {"a", "b"}, {"a", "c"}, {"a", "d"}, {"b", "c"}, {"b", "d"}, {"c", "d"}, {"a", "b", "c"}, ...} 

但我无法弄清楚如何自动生成它。

4 个答案:

答案 0 :(得分:1)

您将需要K子集算法实现。我确定它们存在于数学库中,或者您可以编写自己的代码。

S1是你的集合(或字母表),s2是长度为k(5)的子集。

答案 1 :(得分:1)

你必须编写自己的生成器,或者使用一些库来进行排列/组合,应该有大量的数学库可以这样做。这里有自己实现的例子:

https://codereview.stackexchange.com/questions/41510/calculate-all-possible-combinations-of-given-characters

在我看来,链接中的示例正是您所需要的 - 只需更改输入数组和长度即可。另外作者把它放在一个字符串中,我看到你想把它放在数组数组中,所以输出也应该改变

答案 2 :(得分:0)

我会给你解决这个问题的想法。

从空输出字符串开始。逐个添加所有字符到前缀。对于添加的每个字符,通过递归调用k等于k-1来打印具有当前前缀的所有可能的字符串。

这里K是你案例1到5的长度。

答案 3 :(得分:0)

我使用了这段代码:

    ...
    String[] cols = ... //linea in input
    Set<String> subSet= new HashSet<String>();
    Set<Set<String>> sets = new HashSet<Set<String>>();

    //popolo l'insieme - escludo la data
    for(int i=1; i<cols.length; i++){
        subSet.add(cols[i]);
    }


    // creo l'insieme delle parti e popolo
    sets = powerSet(subSet);

 public static Set<Set<String>> powerSet(Set<String> originalSet) {

    Set<Set<String>> sets = new HashSet<Set<String>>();
    if (originalSet.isEmpty()) {
        sets.add(new HashSet<String>());
        return sets;
    }
    List<String> list = new ArrayList<String>(originalSet);
    String head = list.get(0);
    Set<String> rest = new HashSet<String>(list.subList(1, list.size()));
    for (Set<String> set : powerSet(rest)) {
        if(set.size() < 5){
            Set<String> newSet = new HashSet<String>();
            newSet.add(head);
            newSet.addAll(set);
            sets.add(newSet);
            sets.add(set);
        }
    }

    return sets;
}