Arrays.sort在java中不起作用

时间:2014-12-24 14:29:16

标签: java android sorting

我有一个名为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;相等(这是正确的)。其他人根本没有比较。

为什么?

1 个答案:

答案 0 :(得分:1)

现在我们可以看到纬度和经度的字符串值,我怀疑我知道这个问题。 Double.parseDouble会为这样的字符串抛出异常:41,352979

我的猜测是,你正在某个地方捕捉Exception并有效地忽略它。当比较器尝试解析无效值时,在sort方法期间抛出该异常。

要解决的问题:

  • 您的数据:我们不知道您从哪里获得纬度和经度,但看起来它不是&#34;清洁&#34;在数字表示方面
  • 您的数据模型:Company.getLatitudeCompany.getLongitude已经是double值;它不应该由用户来修剪字符串并解析它们
  • 你的异常处理:假设我是对的,你不应该像你一样忽略例外
  • 您的诊断:如果发生异常,您应该始终记录它,无论您以后做什么