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

如何按经纬度从近到远排序并存入ArrayList?代码实现咨询

我来帮你搞定经纬度按距离从近到远排序并存入ArrayList<LatLng>的需求,结合你给出的代码片段,咱们一步步实现:

核心思路
  1. 先把所有需要排序的地址(你代码里的取货/送货地址)转换为LatLng对象
  2. 以你指定的原点(代码里的originAddr)为基准,计算每个LatLng到原点的距离
  3. 使用自定义比较器对LatLng列表按距离从小到大排序
  4. 将排序后的结果存入mPoints
完整代码实现

首先补充你代码里的Geocoder解析部分,再添加排序逻辑:

// 初始化临时列表存放所有解析出的LatLng
List<LatLng> tempLatLngList = new ArrayList<>();
// 获取原点的经纬度(从你代码里的originAddr提取)
double originLat = originAddr.getLatitude();
double originLng = originAddr.getLongitude();

String address;
String address1;
Geocoder geocoder = new Geocoder(con);
Address originAddr = addressList1.get(0);
// 假设你已经正确拿到jobs列表和addressList数据

for (int i = 0; i < jobs.size(); i++) {
    address = jobs.get(i).get("pick_address");
    address1 = jobs.get(i).get("delivery_address");
    List<Address> addrList2 = null;
    List<Address> addrList3 = null;

    try {
        // 解析取货地址为LatLng,只取最匹配的第一个结果
        addrList2 = geocoder.getFromLocationName(address, 1);
        if (addrList2 != null && !addrList2.isEmpty()) {
            Address pickAddr = addrList2.get(0);
            LatLng pickLatLng = new LatLng(pickAddr.getLatitude(), pickAddr.getLongitude());
            tempLatLngList.add(pickLatLng);
        }

        // 解析送货地址为LatLng(如果不需要处理送货地址,直接删除这段即可)
        addrList3 = geocoder.getFromLocationName(address1, 1);
        if (addrList3 != null && !addrList3.isEmpty()) {
            Address deliveryAddr = addrList3.get(0);
            LatLng deliveryLatLng = new LatLng(deliveryAddr.getLatitude(), deliveryAddr.getLongitude());
            tempLatLngList.add(deliveryLatLng);
        }
    } catch (IOException e) {
        // 处理地址解析失败的异常,比如打印日志排查问题
        e.printStackTrace();
    }
}

// 对LatLng列表按到原点的距离从小到大排序
Collections.sort(tempLatLngList, new Comparator<LatLng>() {
    @Override
    public int compare(LatLng latLngA, LatLng latLngB) {
        // 用Android SDK提供的方法计算球面距离,单位为米
        float[] distanceToA = new float[1];
        Location.distanceBetween(originLat, originLng, latLngA.latitude, latLngA.longitude, distanceToA);

        float[] distanceToB = new float[1];
        Location.distanceBetween(originLat, originLng, latLngB.latitude, latLngB.longitude, distanceToB);

        // 比较距离实现从近到远排序,调换参数可改为从远到近
        return Float.compare(distanceToA[0], distanceToB[0]);
    }
});

// 将排序后的结果存入你的mPoints列表
mPoints = new ArrayList<>(tempLatLngList);
关键细节说明
  • 解析容错处理:必须判断addrList2/addrList3是否为null或空列表,避免空指针异常——地址解析可能因为地址无效、网络问题等失败
  • 距离计算可靠性:用Location.distanceBetween比自己手写Haversine公式更省心,Android SDK已经帮我们处理了球面距离的精准计算
  • 排序灵活调整:如果需要从远到近排序,只需要把Float.compare的两个参数调换位置即可
  • 地址类型筛选:如果只需要处理取货地址或者送货地址,直接删除对应类型的解析代码就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:01:29