如何查找二维数组中经纬度匹配的行,将指定部分复制到一维数组
原有代码问题梳理
- 循环边界错误:外层循环条件写为
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
相关产品推荐
相关产品推荐

