如何将对象转换为集合?



我有一个名为"all"包含对象Doc的。然后我有另一组叫做"partdoc"包含其他包含Doc的集合。比方说"全部"contains = [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),它包含了包含docs的集合

set2无效存在缺陷。

不是

set2.clear();

应该是

set2 = new HashSet<Doc>();

如果我们对partDocs使用列表,这个bug可能更容易理解

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>();

,否则每次都添加一个不同的元素。

最新更新