对二维ArrayList进行排序

时间:2015-05-20 10:31:26

标签: java sorting arraylist

我正在尝试在stop_lat, stop_lon表中的传入latD, longD和存储的距离之间获得最远距离及其stops。我将lat_stop, lon_stop, distStops存储在双拖曳维列表中。目前我收到此错误

  • 类型集合中的方法min(Collection,Comparator)不适用于参数      (List>,new Comparator>(){})
  • 类型集合中的方法sort(List,Comparator)不适用于参数   (ArrayList>,new Comparator>(){})

示例:

  

(140.4,83.346723,12.567835),

     

(90.6,83.0984543,10.347291),

     

(6.4,83.6453974,12.570937),

     

(25.7,83.198472,13.7364563)

我想要这套(6.4, 83.6453974, 12.570937)

如何获得最短距离及其相关的stop_lat, stop_lon

我感谢任何帮助。

            // the stops and arrrivaltimes tables exist.

            PreparedStatement preparedLatLong = con
                    .prepareStatement("SELECT lat, longi, name from stops");
            ResultSet rsLatLong = preparedLatLong.executeQuery();

            // ArrayList<Double> distanceHistory = new ArrayList<Double>();
            ArrayList<List<Double>> distanceHistory = new ArrayList<List<Double>>();

            while (rsLatLong.next()) {
                double lat_stop = rsLatLong.getDouble("lat");
                double lon_stop = rsLatLong.getDouble("longi");
                double distStops = haversineDistance(latD, longD, lat_stop,
                        lon_stop);
                distanceHistory.add(Arrays.asList(distStops, lat_stop,
                        lon_stop));
                ;


            }
            //Find the shortest diestance and its related longi and lati
            Collections.sort(distanceHistory,
                    new Comparator<ArrayList<Double>>() {

                        @Override
                        public int compare(ArrayList<Double> o1,
                                ArrayList<Double> o2) {
                            // TODO Auto-generated method stub
                            return o1.get(0).compareTo(o2.get(0));
                        }

                    }

            );

2 个答案:

答案 0 :(得分:3)

您已将distanceHistory列表定义为ArrayList<List<Double>>。这意味着此列表中的每个元素都是List<Double>

但是,您将比较器定义为Comparator<ArrayList<Double>>。这意味着它希望它所比较的​​项目具体为ArrayList<Double>

当您使用Collections.sort时,它需要一个基本类型比基本类型更通用的比较器。 ArrayList<Double> List<Double>更通用。

简单的解决方案是将比较器的定义更改为Comparator<List<Double>>

但这种设计真的不太好。你应该使用列表来“类似”的东西。不代表相同类型信息的三个双打的列表不是一个好的设计。最好为此创建一个小类:

private static class StopItem implements Comparable<StopItem> {
    double stopLat, stopLon, stopDist;

    public StopItem( double stopLat, stopLon, stopDist ) {
        this.stopLat = stopLat;
        this.stopLon = stopLon;
        this.stopDist = stopDist;
    }

    // Getters, setters...

    @Override
    public int compareTo( StopItem otherItem ) {
        return Double.compare( this.stopDist, otherItem.stopDist );
    }

}

然后,您可以创建这些对象的列表,并在其上使用Collections.sort(),而您不需要额外的比较器。

例如,以下是填写列表的方式:

    List<StopItem> distanceHistory = new ArrayList<>();

    while (rsLatLong.next()) {
        double latStop = rsLatLong.getDouble("lat");
        double lonStop = rsLatLong.getDouble("longi");
        double distStop = haversineDistance(latD, longD, latStop, lonStop);
        StopItem newItem = new StopItem( latStop, lonStop, distStop );
        distanceHistory.add(newItem);

    }

然后你可以使用Collections.sort(distanceHistory)

答案 1 :(得分:0)

首先,Comparator应该采用List<Double>类型的两个参数:

Collections.sort( distanceHistory,
                  new Comparator<List<Double>>()
                  {
                       @Override
                       public int compare(List<Double> o1,List<Double> o2 ) {
...

因为那是

元素的类型
ArrayList<List<Double>> distanceHistory = new ArrayList<List<Double>>();

(你的代码是否按原样进行编译?)

其次,您可能希望稍微处理一下您的数据结构;也许是一个具有三个属性的元组/类,而不仅仅是List - 现在你在对象拒绝 :-)例如。

class MyThingy implements Comparable<MyThingy> {
    Double lat, lon, dist;

    @Override compareTo( MyThingy other ) {
        // implement sensibly.
    }
}

然后你可以

List<MyThingy> distanceHistory = new ArrayList<MyThingy>();    
...
Collections.sort( distanceHistory );

无需提供匿名比较器。

干杯,