如何将对象转换为集合?

How to convert an object to a set?

所以我有一个名为“all”的集合,其中包含对象 Doc。然后我有另一个名为“partDocs”的集合,其中包含包含 Doc 的其他集合。假设“全部”包含 = [Doc1, Doc2, Doc3]。我希望 partDocs 包含这些集合,例如:[[Doc1]、[Doc2]、[Doc3]]。我该怎么做?

我试过了

Set<Doc> all = new HashSet<Doc>(); // contains [Doc1, Doc2, Doc3]
Set<Set<Doc>> partDocs = new HashSet<Set<Doc>>();
Set<Doc> set2 = new HashSet<Doc>();

for (i = 0; i < all.size(); i++) {
   set2.clear();
   set2.add(all.stream().toList().get(i)); // adds the i.th element of the all set
   partDocs.add(set2);
}

然而,当我这样做时,partDocs 只有所有集合的最后一个元素,因为 set2 总是在变化,它的最后一个值是 [Doc3]

下面我也试过了,但是语法不对

for (i = 0; i < all.size(); i++) {
   partDocs.add(Set<allDocuments.stream().toList().get(i)>);
}

有人知道如何实现吗?

我不知道你是否真的想这样做。这似乎是非常混乱的代码,但请尝试以下操作:

Set<Set<Doc>> partDocs = new HashSet<Set<Doc>>();
Set<Doc> all = new HashSet<>();

for(Doc doc : all) {
    partDocs.add(Set.of(doc));
}

现在您有一个集合 (partDocs),其中包含包含文档的集合

set2 的失效是有缺陷的。

而不是

set2.clear();

应该是

set2 = new HashSet<Doc>();

如果我们使用 partDocs

的列表,这个特定的错误可能更容易理解
List<Set<Doc>> partDocs = new ArrayList<Set<Doc>>();

这导致

[[Doc3], [Doc3], [Doc3]]

本质上,我们将相同的 Set 添加到 List 并且由于我们使用相同的引用,因此连续调用 set2.clear()set2.add() 将影响两者List.

中的局部变量和 Set

回到 partDocs 作为 Set,它最终将只有一个条目,因为 Set 保证不包含重复值,并且三个相同的实例当然是重复。


因此,要修复此错误,我们必须确保添加到 partDocs 的三个对象真正不同,这是由新的失效例程(部分)完成的

set2 = new HashSet<Doc>();

除此之外,我们每次都会向其中添加不同的元素。