我在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"}, ...}
但我无法弄清楚如何自动生成它。
答案 0 :(得分:1)
您将需要K子集算法实现。我确定它们存在于数学库中,或者您可以编写自己的代码。
S1是你的集合(或字母表),s2是长度为k(5)的子集。
答案 1 :(得分:1)
你必须编写自己的生成器,或者使用一些库来进行排列/组合,应该有大量的数学库可以这样做。这里有自己实现的例子:
在我看来,链接中的示例正是您所需要的 - 只需更改输入数组和长度即可。另外作者把它放在一个字符串中,我看到你想把它放在数组数组中,所以输出也应该改变
答案 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;
}