我正在尝试在stop_lat, stop_lon
表中的传入latD, longD
和存储的距离之间获得最远距离及其stops
。我将lat_stop, lon_stop, distStops
存储在双拖曳维列表中。目前我收到此错误
示例:
(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));
}
}
);
答案 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 );
无需提供匿名比较器。
干杯,