gpt4 book ai didi

Java 流处理顺序

转载 作者:行者123 更新时间:2023-12-02 03:14:54 26 4
gpt4 key购买 nike

我相信对我来说,一步步写出我必须做的事情并复制到目前为止的代码比尝试用长文本解释它更容易。

这是我必须做的:

  1. 逐行读取文件
  2. 在这些行中映射键
  3. 按 1 个键(下面代码中的 getUri)合并行并(获取另一个键 (getRequestDuration) 的平均值)
  4. 按合并的 getRequestDuration 的平均值排序(最高的在前)
  5. 返回最高的 n 个金额。

这就是我现在得到的:

try(Stream<String> logs = Files.lines(Paths.get(args))) {           
logs.map(LogLine::parseLine).limit(10).sorted((e1, e2) -> Integer.compare(e1.getRequestDuration(),
e2.getRequestDuration()))
.collect(Collectors.groupingBy(
LogLine::getUri,
Collectors.averagingDouble(LogLine::getRequestDuration)));
return logs;

我是 Java 新手,所以我有几个问题希望有人能回答我:

  1. 在排序之前收集/分组后如何排序?
  2. 如何适当限制?这样它限制了我返回的条目数量,而不是我浏览的条目数量。

我(认为我)了解流的工作原理,但我在将其应用于现实世界时遇到了困难。我不一定要寻找我所面临的问题的完整代码,而不是寻找可以向我提供了解如何做到这一点所需的信息的人。如果有人写出如何以正确的方式解决流的此类问题,我将非常感激。

最佳答案

您可以尝试以下操作,按 URI 和平均持续时间作为值进行分组,从结果映射中按值排序并限制预期结果的数量。

    Map<String, Double> uriDurationMap = logs.map(LogLine::parseLine).collect(Collectors.groupingBy(LogLine::getUri,Collectors.averagingDouble(LogLine::getRequestDuration)));

从 map 中排序和过滤

    Map<String, Double> filteredMap = uriDurationMap.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)).limit(10).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

要保留顺序,请使用LinkedHashMap

    Map<String, Double> filteredMap = uriDurationMap.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)).limit(10).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (k,v) -> v, LinkedHashMap::new));

如果只需要值,

    List<Double> filteredList = uriDurationMap.values().stream().sorted().limit(10).collect(Collectors.toList());

关于Java 流处理顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40461749/

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