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

如何用Java计算n维空间中两点间的欧几里得距离?

通用欧几里得距离计算实现

要实现无需判断坐标数量的通用欧几里得距离计算,核心思路是把点的坐标以数组形式存储,通过遍历所有维度的坐标差完成平方累加,最后取平方根。这样不管是2维、3维还是更高维度,都能统一处理,契合类似numpy的向量运算逻辑。

基础通用实现

public static double getDistance(double[] point, double[] refPoint) {
    if (point.length != refPoint.length) {
        throw new IllegalArgumentException("两点的坐标维度必须一致");
    }
    
    double sumOfSquares = 0.0;
    for (int i = 0; i < point.length; i++) {
        double diff = point[i] - refPoint[i];
        sumOfSquares += diff * diff; // 直接平方比Math.pow更高效
    }
    return Math.sqrt(sumOfSquares);
}

更简洁的Java 8+流实现

如果想用更紧凑的写法,可结合Java流处理:

public static double getDistance(double[] point, double[] refPoint) {
    if (point.length != refPoint.length) {
        throw new IllegalArgumentException("两点的坐标维度必须一致");
    }
    
    return Math.sqrt(IntStream.range(0, point.length)
            .mapToDouble(i -> {
                double diff = point[i] - refPoint[i];
                return diff * diff;
            })
            .sum());
}

适配自定义多维Point类

如果项目中有自定义的多维Point类(比如PointND),可以给它添加坐标数组的获取方法,再复用上面的通用函数:

class PointND {
    private final double[] coordinates;
    
    public PointND(double... coordinates) {
        this.coordinates = coordinates;
    }
    
    public double[] getCoordinates() {
        return coordinates;
    }
}

// 调用示例
public static double getDistance(PointND p, PointND ref) {
    return getDistance(p.getCoordinates(), ref.getCoordinates());
}

关键说明

  • 用diff * diff替代Math.pow(diff, 2),避免方法调用开销,性能更优
  • 提前校验坐标维度一致性,避免运行时数组越界异常
  • 无论维度多少,代码逻辑完全统一,无需额外分支判断,实现了"向量运算"式的优雅处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:20:43