前言
项目中用到全国的加油站数据加载 并根据经纬度算出距离 然后根据距离从小到大排序
主要是数据类型是Double 这里必须对数据进行封装
实现也不难 这里讲一下自己的实现方法和实现思路
效果图
先来看下 未排序下的效果图
仔细看上图中的距离 是没有排序的 距离都是打乱的 我们的目的是从小到大完成排序。
Double类型数据排序
Collections.sort(mList, new Comparator() {
public int compare(State o1, State o2) {
//这里的数据类型如果是double 会报错
//错误提示:cannot invoke compareTo(double) on the primitive type double
return o1.compareTo(o2);
}
});
double不能直接排序的解决方法
compareTo只适合实现了Comparable的对象类型
// 第一种修改方法:
Collections.sort(mList, new Comparator() {
public int compare(State o1, State o2) {
return new Double(o1).compareTo(new Double(o2));
}
});
}
// 第二种解决方法是:
double distance;//对distance的定义
//修改为:
Double distance;
//distance改为double的包装类Double类型
}
排序代码实现
根据我们拿到的数据 然后对数据做处理 也就是计算 拿到每个Bean里的经纬度
if (homeModelBaseBean.getCode() == SUCCESS) {
//拿到数据
List data = homeModelBaseBean.getData();
//非空判断
if (data != null && data.size() > 0) {
for (int i = 0; i < data.size(); i++) {
//排序接口 实现compare
Collections.sort(data, new Comparator() {
@Override
public int compare(HomeModel o1, HomeModel o2) {
//这里拿到当前经纬度和油站经纬度通过Utils算出每个油站距离当前的距离
//再根据距离实现从近到远的排序
double dis = GetDistanceUtils.getDistance(latLng.longitude,
latLng.latitude, o1.getGasAddressLongitude(),
o1.getGasAddressLatitude());
double dis2 = GetDistanceUtils.getDistance(latLng.longitude,
latLng.latitude,
o2.getGasAddressLongitude(), o2.getGasAddressLatitude());
//打印log看下数据排序
Log.e(TAG, "算出距离为:" + dis);
//这里使用第一种修改方法 new Double类型
//因为这个距离是算出来的 并不是后台返回定义的类型
return new Double(dis).compareTo(dis2);
}
});
}
}
mHomeView.showGasList(data);
} else {
mHomeView.showNetWorkError();
}
Log
排序实现(距离从近到远)
来源:oschina
链接:https://my.oschina.net/u/4274724/blog/4299787