如何将Set<Doc>中每个元素转为单元素Set并存入Set<Set<Doc>>
你之前代码出错的核心原因是循环全程复用了同一个set2实例,HashSet是引用类型,你往partDocs里添加的是这个实例的引用,后续修改set2的内容会同步影响所有已经添加到partDocs里的项,最终所有项都会变成最后一次修改的结果。你第二个写法的语法错误是因为尖括号是用来声明泛型类型的,不能直接填具体的对象实例,不符合Java语法规范。
以下是可直接运行的正确实现方案:
方案1:基础循环写法(兼容所有Java版本,生成可变Set)
每次循环都新建独立的HashSet实例,避免引用共用,同时直接遍历Set不需要转List按下标取值,效率更高:
Set<Doc> all = new HashSet<Doc>(); // 已存入Doc1、Doc2、Doc3 Set<Set<Doc>> partDocs = new HashSet<Set<Doc>>(); for (Doc doc : all) { Set<Doc> singleSet = new HashSet<Doc>(); singleSet.add(doc); partDocs.add(singleSet); }
方案2:简洁写法(Java 8及以上,生成不可变单元素Set)
用Collections.singleton直接生成单元素集合:
import java.util.Collections; Set<Doc> all = new HashSet<Doc>(); Set<Set<Doc>> partDocs = new HashSet<Set<Doc>>(); for (Doc doc : all) { partDocs.add(Collections.singleton(doc)); }
方案3:流式写法(Java 8及以上,代码更简洁)
用Stream流完成转换,代码更精简:
import java.util.stream.Collectors; import java.util.Collections; // Java 8可用版本,生成不可变单元素Set Set<Set<Doc>> partDocs = all.stream() .map(Collections::singleton) .collect(Collectors.toSet()); // Java 9及以上可以用Set.of写法更直观 Set<Set<Doc>> partDocs = all.stream() .map(doc -> Set.of(doc)) .collect(Collectors.toSet());
如果需要单元素Set为可变类型,只需把流式写法中map的逻辑替换为自定义创建HashSet的逻辑即可。
内容的提问来源于stack exchange,提问作者turbagu
相关产品推荐
相关产品推荐

