【问题标题】:How to stream through a Set<Set<Integer>> and put it into a HashMap as the value?如何通过 Set<Set<Integer>> 流式传输并将其作为值放入 HashMap?
【发布时间】:2021-09-14 08:43:21
【问题描述】:

我有一套:

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]} 

【问题讨论】:

    标签: java hashmap set java-stream nested-sets


    【解决方案1】:

    这样使用

        AtomicInteger counter = new AtomicInteger(0);
        Map<Integer,Set<Integer>> map = nestedSet.stream()  .collect(Collectors.toMap(x -> counter.getAndIncrement(), x -> x));
    

    为了在集合中维护插入顺序,您使用链接的 HashSet

    【讨论】:

    • 感谢您的快速回复。有没有一种简单快捷的方法可以将子集插入到 LinkedHashSet 中,就像我在嵌套集中所做的那样。类似于 Set.of(1,2,3) 的东西?我不想做linkedHashSet.add 20次
    • 我不认为该操作有任何缩写
    【解决方案2】:

    实际上你可以跳过 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 2011-08-22
      • 1970-01-01
      • 2015-06-18
      • 2022-11-20
      • 2018-12-16
      相关资源
      最近更新 更多