我想弄清楚的是一种算法,它会创建可能的对,而不管无限期值的顺序。
例如,假设该集合为A,B,C,D,E然后可能的设置是
AB AC 广告 AE 公元前 光盘 DE
但是......我也想要两个以上的值。
例如
ABC ABD ABE BCD BCE
还有ABCD或ABCE。这里的问题是我想创建一个输入一个字符串STring []数组的方法,输出将是一对2,3的字符串列表....最多值-1。
如果有人想到解决方案,请提供帮助。 :)
答案 0 :(得分:5)
似乎你想构建一个power set。 This question基本上是相同的,在那里寻找答案。
答案 1 :(得分:0)
这是你可以做的计算密集度最高的事情之一。即使是远程大量的数据,这也无法很好地扩展。
对于不确定的集合来说,这实际上是不切实际的。您可以限制可以生成的对,从而使这个比例更好。
答案 2 :(得分:0)
答案 3 :(得分:0)
不是最有效的,而是一种解决方案:
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class PowersetTest {
public static void main(String [] args){
Set<Set<String>> sets = permute(Arrays.asList("a","b","c","d","e"));
for (Set<String> item : sets){
System.out.printf("Set: %s%n", item.toString());
}
}
static public <T> Set<Set<T>> permute (Collection<T> items){
Set<Set<T>> result = new HashSet<Set<T>>();
for (final T item : items){
Set<T> subsetElements = filter(items, new Predicate<T>(){public boolean apply(T f){ return (f!=item);}});
if (subsetElements.size() > 0) {
result.addAll(permute(subsetElements));
}
Set<T> temp = new HashSet<T>();
temp.addAll(items);
result.add(temp);
}
return result;
}
static public <T> Set<T> filter(Collection<T> items, Predicate<T> filter){
Set<T> result = new HashSet<T>();
for (T item : items){
if (filter.apply(item)) {
result.add(item);
}
}
return result;
}
public interface Predicate<T>{ public boolean apply(T item); }
}