我有一个名为Company的自定义类,它的字段是纬度和经度。 我想根据与当前位置的距离对它们进行排序,但它似乎不起作用。
我已经仔细检查了所有数据,并且它们是正确的但是由于某种原因排序似乎不起作用。
代码是:
currentCompanies=AllCompanies.sortByDistanceFromOwnLocation(currentCompanies, AppConstant.userLatitude, AppConstant.userLongitude);
调用这些:
public static Vector<Company> sortByDistanceFromOwnLocation(
Vector<Company> locations, final double myLatitude,
final double myLongitude) {
Comparator comp = new Comparator<Company>() {
@Override
public int compare(Company o, Company o2) {
float[] result1 = new float[3];
android.location.Location.distanceBetween(myLatitude,
myLongitude,
Double.parseDouble(o.getLatitude().trim()),
Double.parseDouble(o.getLongitude().trim()),
result1);
Float distance1 = result1[0];
float[] result2 = new float[3];
android.location.Location.distanceBetween(myLatitude,
myLongitude,
Double.parseDouble(o2.getLatitude().trim()),
Double.parseDouble(o2.getLongitude().trim()),
result2);
Float distance2 = result2[0];
return distance1.compareTo(distance2);
}
};
Collections.sort(locations, comp);
return locations;
}
从Collection.class中调用它:
/**
* Sorts the given list using the given comparator. The algorithm is
* stable which means equal elements don't get reordered.
*
* @throws ClassCastException if any element does not implement {@code Comparable},
* or if {@code compareTo} throws for any pair of elements.
*/
@SuppressWarnings("unchecked")
public static <T> void sort(List<T> list, Comparator<? super T> comparator) {
T[] array = list.toArray((T[]) new Object[list.size()]);
Arrays.sort(array, comparator);
int i = 0;
ListIterator<T> it = list.listIterator();
while (it.hasNext()) {
it.next();
it.set(array[i++]);
}
}
我做错了什么?
编辑:
更多信息。我有8家公司 - 让我们说1到8的id。我在比较方法中添加了这个日志:
System.out.println("Compare between id :" + o.getId() + " and " + o2.getId());
并且仅针对这些内容被调用:
Compare between id :2 and 1
Compare between id :3 and 2
所有公司的数据是:
12-24 17:00:51.318: I/System.out(19041): Company : 1 Latitude :37.9407699 Longitude:23.7489698
12-24 17:00:51.318: I/System.out(19041): Company : 2 Latitude :37.9407699 Longitude:23.7489698
12-24 17:00:51.318: I/System.out(19041): Company : 3 Latitude :37.9407699 Longitude:23.7489698
12-24 17:00:51.319: I/System.out(19041): Company : 4 Latitude :41,352979 Longitude:26,502281
12-24 17:00:51.319: I/System.out(19041): Company : 5 Latitude :41,352979 Longitude:26,502281
12-24 17:00:51.319: I/System.out(19041): Company : 6 Latitude :41,352979 Longitude:26,502281
12-24 17:00:51.319: I/System.out(19041): Company : 7 Latitude :37.0861346 Longitude:25.1608451
12-24 17:00:51.319: I/System.out(19041): Company : 8 Latitude :38.078994 Longitude:23.727481
id 1和2以及2和3之间的比较结果是0 =&gt;相等(这是正确的)。其他人根本没有比较。
为什么?
答案 0 :(得分:1)
现在我们可以看到纬度和经度的字符串值,我怀疑我知道这个问题。 Double.parseDouble
会为这样的字符串抛出异常:41,352979
。
我的猜测是,你正在某个地方捕捉Exception
并有效地忽略它。当比较器尝试解析无效值时,在sort
方法期间抛出该异常。
要解决的问题:
Company.getLatitude
和Company.getLongitude
已经是double
值;它不应该由用户来修剪字符串并解析它们