我有一个名为"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>();
,否则每次都添加一个不同的元素。