如何流过 Set<Set<Integer>> 并将其作为值放入 HashMap?

How to stream through a Set<Set<Integer>> and put it into a HashMap as the value?

我有一套:

Set<Set<Integer>> nestedSet = Set.of(Set.of(1, 9), Set.of(0,2,4), Set.of(14,1), Set.of(2,23,13), Set.of(14,22));

我想要存档的是按时间顺序流过 nestedSet(我知道 Set 不是按时间顺序排列的,我应该改用 LinkedHashSet 吗?)并将每个 Set 放入 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,2,4],2=[14,1],3=[2,23,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), linkedSetOf(14, 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;
    }
}