如何将对象转换为集合?
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>();
除此之外,我们每次都会向其中添加不同的元素。
所以我有一个名为“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>();
除此之外,我们每次都会向其中添加不同的元素。