You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Collectors按矩形周长(length)分组并获取每组最小宽度

问题解决:按周长分组并获取每组最小宽度

你的需求是对ArrayList<Rectangle>按周长(通过getLength()获取)分组,然后计算每组的最小宽度,但当前代码返回的是Map<Double, Optional<Rectangle>>,无法直接得到宽度值。

解决方案1:用reducing直接计算最小宽度

可以直接通过Collectors.reducing跳过中间的Rectangle对象,直接对宽度进行最小值计算,这样返回的就是Map<Double, Double>:

public static Map<Double, Double> groupIdenticalPerimeterWidth(ArrayList<Rectangle> rectangles) {
    return rectangles.stream()
        .collect(Collectors.groupingBy(
            Rectangle::getLength,
            Collectors.reducing(
                Double.MAX_VALUE,  // 初始值,确保第一个宽度能替换它
                Rectangle::getWidth,
                Math::min
            )
        ));
}

解决方案2:处理minBy的结果提取宽度

如果想保留先找最小宽度矩形的逻辑,可以用Collectors.collectingAndThen对minBy的结果进行后续处理,提取宽度并处理Optional:

public static Map<Double, Double> groupIdenticalPerimeterWidth(ArrayList<Rectangle> rectangles) {
    return rectangles.stream()
        .collect(Collectors.groupingBy(
            Rectangle::getLength,
            Collectors.collectingAndThen(
                Collectors.minBy(Comparator.comparingDouble(Rectangle::getWidth)),
                // 提取宽度,若分组为空则抛出异常(根据你的场景调整)
                optRect -> optRect.map(Rectangle::getWidth).orElseThrow(() -> new IllegalArgumentException("分组中无元素"))
            )
        ));
}

说明

  • 第一种方案更高效,因为它直接操作宽度值,不需要额外处理Rectangle对象。
  • 第二种方案适合需要先获取最小宽度对应的Rectangle,再提取宽度的场景,orElseThrow可以根据你的业务需求替换为orElse(0.0)这类默认值,避免空指针问题。

内容的提问来源于stack exchange,提问作者Overdrowsed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:24:31