问题描述
我有一套:
Set<Set<Integer>> nestedSet = Set.of(Set.of(1,9),Set.of(0,2,4),Set.of(14,1),Set.of(2,23,13),22));
我想要存档的是按时间顺序流过nestedSet(我知道一个集合不是按时间顺序排列的,我应该使用LinkedHashSet代替吗?)并将每个集合作为值放入Hashmap . Hashmap 的 key 应该是一个以 0 开头的索引。 像这样:
HashMap<Integer,Set<Integer>> hashMap = new HashMap<>();
for ( int i = 0; i < nestedSet.size; i++){
nestedSet.stream();
hashMap.put(i,firstSet);
}
输出应该是:
System.out.printl(hashMap);
{0=[1,9],1=[0,4],2=[14,1],3=[2,13],4=[14,22]}
解决方法
这样使用
AtomicInteger counter = new AtomicInteger(0);
Map<Integer,Set<Integer>> map = nestedSet.stream() .collect(Collectors.toMap(x -> counter.getAndIncrement(),x -> x));
为了在集合中维护插入顺序,您使用链接的 HashSet
,实际上你可以跳过 AtomicInteger 的开销。加上更简单的方法来创建保持插入顺序所需的 LinkedHashSet:
public class App {
public static void main(String[] args) {
Set<Set<Integer>> nestedSet = linkedSetOf(linkedSetOf(1,9),linkedSetOf(0,2,4),linkedSetOf(14,1),linkedSetOf(2,23,13),22));
var sharedCounter = new Object() {
int counter;
};
Map<Integer,Set<Integer>> map = nestedSet.stream().collect(Collectors.toMap(num -> sharedCounter.counter++,num -> num));
System.out.println(map);
}
@SafeVarargs
public static <T> LinkedHashSet<T> linkedSetOf(T... objs) {
var hashSet = new LinkedHashSet<T>();
Collections.addAll(hashSet,objs);
return hashSet;
}
}