gpt4 book ai didi

java - 使用 Streams 将 PriorityQueue 转换为 Map

转载 作者:行者123 更新时间:2023-12-01 11:42:45 25 4
gpt4 key购买 nike

我有一个整数优先级队列:PriorityQueue<Integer> pq
我想以声明的方式将其转换为具有此过程的 map :

  • poll应该给 key
  • size应该给出 val

  • 这是我尝试过的
    pq.stream().collect(Collectors.groupingBy(queue::poll, queue::size));

    但这不起作用,因为方法引用不是功能接口(interface)/收集器。

    所以我正在寻找一种方法来实现这一点。

    我知道我可以使用循环并将条目放入 map 中,但我希望在这里使用声明式样式。

    最佳答案

    I have an array of numbers. I then want to map each value in the array to an integer that is the number of values LESS THAN the current value in the array.



    这是您应该在问题中说明的内容:)

    因为你想在功能上做到这一点,我建议分两步解决:
  • 从初始整数数组
  • 构建频率图
  • 使用频率图构建您的结果图

  • 下面的代码片段实现了这一点:
    int[] array = { 42, 3, 100, 56, 3, 11 };

    NavigableMap<Integer, Long> frequencyMap = Arrays.stream(array).boxed()
    .collect(Collectors.groupingBy(Function.identity(), TreeMap::new,
    Collectors.counting()));

    Map<Integer, Long> countMap = frequencyMap.entrySet().stream()
    .collect(Collectors.toMap(Map.Entry::getKey,
    entry -> frequencyMap.headMap(entry.getKey())
    .values().stream().mapToLong(Long::longValue).sum()));

    System.out.println(countMap);

    输出:
    {3=0, 100=5, 56=4, 42=3, 11=2}

    如果您有 PriorityQueue<Integer>而不是 int[] , 你可以改变:
    Arrays.stream(array).boxed()

    到:
    queue.stream()

    不管上面的代码片段如何,我建议用命令式而不是函数式来解决这个问题;它会更具可读性,并且您将能够进一步优化它。

    关于java - 使用 Streams 将 PriorityQueue 转换为 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61549994/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com