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

如何查找二维数组中经纬度匹配的行,将指定部分复制到一维数组

原有代码问题梳理

  • 循环边界错误:外层循环条件写为i <= weather.length,数组下标从0开始,最大合法下标为weather.length - 1,会直接触发数组越界异常
  • 行列逻辑混淆:你已经明确每行前两个元素是经度、纬度,不需要遍历列维度,每一行的经度固定为weather[i][0]、纬度固定为weather[i][1],原代码中i+1、j+1的写法完全搞错了经纬度的存储位置
  • 浮点数比较错误:double是浮点数,存储时存在精度误差,直接用==判断相等大概率会匹配失败,需要用差值的绝对值小于可接受阈值的方式判断是否相等
  • 复制逻辑冗余:匹配到目标行之后直接截取该行后段即可,不需要嵌套循环逐列判断,会严重拖慢执行效率

正确实现方案

注:以下代码中的1e-6为精度阈值,你可以根据你的气象数据精度要求调整到合适的数值

基础循环实现

// 提前定义你要匹配的目标经度targetLon、目标纬度targetLat
double[] data = null;
double precision = 1e-6;

// 只需要遍历所有行即可,不需要遍历列
for (int i = 0; i < weather.length; i++) {
    // 直接取当前行的第0位(经度)、第1位(纬度)做匹配
    if (Math.abs(weather[i][0] - targetLon) < precision 
        && Math.abs(weather[i][1] - targetLat) < precision) {
        // 匹配到目标行,初始化一维数组,长度为当前行长度减2(跳过前两个经纬度元素)
        data = new double[weather[i].length - 2];
        // 从当前行的第2位开始拷贝数据
        for (int j = 2; j < weather[i].length; j++) {
            data[j - 2] = weather[i][j];
        }
        break; // 匹配到后直接退出循环,如果存在多个经纬度相同的站点可删除此行
    }
}

// 可选:增加非空判断处理无匹配站点的情况
if (data == null) {
    // 无匹配经纬度的站点,自行处理对应逻辑
}

更高效的简化实现(调用系统拷贝方法)

double[] data = null;
double precision = 1e-6;

for (int i = 0; i < weather.length; i++) {
    if (Math.abs(weather[i][0] - targetLon) < precision 
        && Math.abs(weather[i][1] - targetLat) < precision) {
        int dataLength = weather[i].length - 2;
        data = new double[dataLength];
        // 调用native层的数组拷贝方法,执行效率更高
        System.arraycopy(weather[i], 2, data, 0, dataLength);
        break;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:15:05