在不确定的值集中创建可能的对,而不管顺序如何

时间:2009-06-09 18:01:25

标签: java compare set

我想弄清楚的是一种算法,它会创建可能的对,而不管无限期值的顺序。

例如,假设该集合为A,B,C,D,E

然后可能的设置是

AB AC 广告 AE 公元前 光盘 DE

但是......我也想要两个以上的值。

例如

ABC ABD ABE BCD BCE

还有ABCD或ABCE。这里的问题是我想创建一个输入一个字符串STring []数组的方法,输出将是一对2,3的字符串列表....最多值-1。

如果有人想到解决方案,请提供帮助。 :)

4 个答案:

答案 0 :(得分:5)

似乎你想构建一个power setThis question基本上是相同的,在那里寻找答案。

答案 1 :(得分:0)

这是你可以做的计算密集度最高的事情之一。即使是远程大量的数据,这也无法很好地扩展。

对于不确定的集合来说,这实际上是不切实际的。您可以限制可以生成的对,从而使这个比例更好。

答案 2 :(得分:0)

您要创建的内容是输入排列的某种power set

Java iterator concept理论上允许无限序列。

但您对比较的问题有什么看法?

答案 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); }
}