按大小整理一组 Java

Organizing a set of sets by size in Java

我正在编写一个简单的程序来递归查找某个较大集合的所有子集。我已经成功了,但我想按尺寸顺序订购所有套装。

我在下面发布了我的工作代码。

import java.util.*;
public class AllSubsets {
   public static void main(String[] args) {
      // Change contents of this array to easily change contents of set.
      Integer[] setContents = {3, 6, 8, 9, 10, 22};
      // create initial unused set by dumping all of the aray into a set.
      Set<Integer> unused = new HashSet<Integer>(Arrays.asList(setContents));
      // create initial empty set for used set.
      Set<Integer> used = new HashSet<Integer>();
      // create output set of sets.
      Set<Set<Integer>> allSets = new HashSet<Set<Integer>>();
      allSets.add(used);
      // find all sets recursively
      findAllSets(used, unused, allSets);
      // print out results
      System.out.println(allSets);
   }

   public static void findAllSets(Set<Integer> used, Set<Integer> unused,
                                  Set<Set<Integer>> allSets) {
      if (unused != null) {
         Set<Integer> copyOfUnused = new HashSet<Integer>(unused);
         for (Integer val : copyOfUnused) {
            unused.remove(val);
            used.add(val);
            allSets.add(new HashSet<Integer>(used));
            findAllSets(used, unused, allSets);
            used.remove(val);
            unused.add(val);
         }
      }
   }
}

我想知道按尺寸订购这些套装的最佳方式是什么。我试图创建一个 TreeSet,它包含多个 HashSet 对象,并覆盖了比较器方法。这最终编译但没有正确存储值。我写的代码和上面的代码很相似,所以我把主要的区别写在下面:

  Set<Set<Integer>> allSets =
     new TreeSet<Set<Integer>>(new Comparator<Set<Integer>>() {
        public int compare(Set<Integer> a, Set<Integer> b) {
           return a.size() - b.size();
        }
     });

在此版本的代码中,它可以编译,但对象存储不正确。在递归方法(使用 println 测试)中计算正确的集合并添加到 "allSets",但它一次只保存一个集合。我有一种感觉,这主要是因为我覆盖了 Set 的比较器,但我使用的是 HashSet。有没有更好的方法来组织我的集合,或者只是我的代码中的一个小错误?

谢谢!!

TreeSet<Set<Integer>>只会存储一个给定大小的Set元素,因为它认为两个大小相同的不同集合是"equal":需要a.compareTo(b) == 0表示a == b

如果您想获取所有集合,然后按大小顺序打印它们,请将所有集合收集到一个常规 (Hash)Set 中,然后对条目进行排序:

List<Set<Integer>> listOfSets = new ArrayList<>(allSets);
Collections.sort(listOfSets, <your comparator above>);
System.out.println(listOfSets).