按大小整理一组 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).
我正在编写一个简单的程序来递归查找某个较大集合的所有子集。我已经成功了,但我想按尺寸顺序订购所有套装。
我在下面发布了我的工作代码。
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).