在Java中按大小组织一组集合

在Java中按大小组织一组集合,java,set,subset,treeset,overriding,Java,Set,Subset,Treeset,Overriding,我正在编写一个简单的程序,递归地查找某个较大集合的所有子集。我已经让它工作了,但我想按大小顺序订购所有的电视机 我把我的工作代码贴在下面 import java.util.*; public class AllSubsets { public static void main(String[] args) { // Change contents of this array to easily change contents of set. Integer[] se

我正在编写一个简单的程序,递归地查找某个较大集合的所有子集。我已经让它工作了,但我想按大小顺序订购所有的电视机

我把我的工作代码贴在下面

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);
         }
      }
   }
}
import java.util.*;
公共类所有子集{
公共静态void main(字符串[]args){
//更改此数组的内容以轻松更改集合的内容。
整数[]setContents={3,6,8,9,10,22};
//通过将所有aray转储到一个集合中来创建初始未使用集合。
Set unused=新的HashSet(Arrays.asList(setContents));
//为已用集合创建初始空集合。
Set used=新的HashSet();
//创建集合的输出集合。
Set allset=new HashSet();
添加(已使用);
//递归查找所有集合
findAllSets(已使用、未使用、所有集合);
//打印结果
系统输出打印项次(全套);
}
公共静态无效findAllSets(设置已使用、设置未使用、,
集合所有集合){
如果(未使用!=null){
Set copyOfUnused=新哈希集(未使用);
for(整数val:CopyOfUsed){
未使用。移除(val);
使用。添加(val);
add(新HashSet(已使用));
findAllSets(已使用、未使用、所有集合);
使用。移除(val);
未使用。添加(val);
}
}
}
}
我想知道最好的办法是按尺寸订购。我试图创建一个树集,其中包含多个HashSet对象,其comparator方法被覆盖。这最终导致编译,但没有正确存储值。我为此编写的代码与上面的代码非常相似,因此我将在下面写出主要区别:

  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();
        }
     });
设置所有集合=
新树集(新比较器(){
公共整数比较(集合a、集合b){
返回a.size()-b.size();
}
});
在此版本的代码中,它可以编译,但对象存储不正确。在递归方法(使用println测试)中,正确的集合被计算并添加到“allset”中,但它一次只保存一个集合。我有一种感觉,这主要是因为我为Set重写了比较器,但我使用的是hashset。有没有更好的方法来组织我的集合,或者只是代码中的一个小错误

谢谢

TreeSet
将只存储一个具有给定大小的集合元素,因为它认为具有相同大小的两个不同集合是“相等的”:它需要
a.compareTo(b)==0
来表示
a==b

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

List<Set<Integer>> listOfSets = new ArrayList<>(allSets);
Collections.sort(listOfSets, <your comparator above>);
System.out.println(listOfSets).
listOfSets=newarraylist(所有集合);
集合。排序(集合列表,);
System.out.println(列表集合)。
TreeSet
将只存储一个具有给定大小的Set元素,因为它认为两个具有相同大小的不同集合是“相等的”:它需要
a.compareTo(b)==0
来表示
a==b

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

List<Set<Integer>> listOfSets = new ArrayList<>(allSets);
Collections.sort(listOfSets, <your comparator above>);
System.out.println(listOfSets).
listOfSets=newarraylist(所有集合);
集合。排序(集合列表,);
System.out.println(列表集合)。
TreeSet
将只存储一个具有给定大小的Set元素,因为它认为两个具有相同大小的不同集合是“相等的”:它需要
a.compareTo(b)==0
来表示
a==b

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

List<Set<Integer>> listOfSets = new ArrayList<>(allSets);
Collections.sort(listOfSets, <your comparator above>);
System.out.println(listOfSets).
listOfSets=newarraylist(所有集合);
集合。排序(集合列表,);
System.out.println(列表集合)。
TreeSet
将只存储一个具有给定大小的Set元素,因为它认为两个具有相同大小的不同集合是“相等的”:它需要
a.compareTo(b)==0
来表示
a==b

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

List<Set<Integer>> listOfSets = new ArrayList<>(allSets);
Collections.sort(listOfSets, <your comparator above>);
System.out.println(listOfSets).
listOfSets=newarraylist(所有集合);
集合。排序(集合列表,);
System.out.println(列表集合)。


而不是在输出时创建一组集合,创建集合列表并编写一个比较器。我不知道您是否在使用Java 8,但如果是,您可以执行
比较器。comparingInt(Set::size)
@bhspencer这是否意味着我需要在添加元素之前手动检查列表中是否存在该元素?列表不保留所有元素必须唯一的属性,对吗?集合会自动为我执行此操作,因此我使用集合。@PaulBoddington我使用的是Java8,但我以前从未见过这种语法。你能给我详细解释一下吗?谢谢这不容易,因为我在用手机,打字很麻烦。Google“method references”并查看Comparator类的文档,而不是在输出时创建一组集合,创建集合列表并编写一个Comparator。我不知道您是否在使用Java 8,但如果是,您可以执行
Comparator.ComparingIT(Set::size)
@bhspencer这是否意味着我需要在添加元素之前手动检查该元素是否存在于列表中?列表不保留所有元素必须唯一的属性,对吗?集合会自动为我执行此操作,因此我使用集合。@PaulBoddington我使用的是Java8,但我以前从未见过这种语法。你能给我详细解释一下吗?谢谢这不容易,因为我在用手机,打字很麻烦。Google“method references”并查看Comparator类的文档,而不是在输出时创建一组集合,创建集合列表并编写一个Comparator。我不知道您是否使用Java 8,但如果使用Java 8,您可以执行
Comparator。ComparingIT(Set::size)
@bhspencer这是否意味着