所以我有一個名為“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)>);
}
有沒有人知道如何實作這一點?
uj5u.com熱心網友回復:
我不知道你是否真的想這樣做。這似乎是非常令人困惑的代碼,但請嘗試以下操作:
Set<Set<Doc>> partDocs = new HashSet<Set<Doc>>();
Set<Doc> all = new HashSet<>();
for(Doc doc : all) {
partDocs.add(Set.of(doc));
}
現在你有一個集合(partDocs),其中包含包含檔案的集合
uj5u.com熱心網友回復:
的無效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()會影響到區域變數和都Set在List。
回到partDocsa Set,它最終只會有一個條目,因為 aSet保證不包含重復值,三個相同的實體當然是重復的。
因此,要修復此錯誤,我們必須確保添加的三個物件partDocs確實不同,這是(部分)由新的失效例程完成的
set2 = new HashSet<Doc>();
否則,我們每次都向它添加不同的元素。
uj5u.com熱心網友回復:
重新宣告set2中回圈。
Set<Set<Doc>> partDocs = new HashSet<Set<Doc>>();
for (int i = 0; i < all.size(); i ) {
Set<Doc> set2 = new HashSet<Doc>();
set2.add(all.stream().toList().get(i)); // adds the i.th element of the all set
partDocs.add(set2);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/311494.html
上一篇:如何為具有相同第一行值的每個第二行值快速處理2xN串列/nparray?
下一篇:有什么辦法可以列出這個清單嗎?
