マップに表示するポイントの (非常に長い) リストがあります。各ポイントからユーザーが入力したポイントまでの距離を計算し、リストを最も近いものから最も遠いものへと並べ替える必要があります。
今、私はこのようにしています:
private List<Point> sortedPointList(LatLng ll, List<Point> pointList)
SparseArray<Double> distances = new SparseArray<Double>();
for (Point ll : pointList){
double distance = calcDistance(ll.getLatLng(), point);
distances.put(ll.getId(), distance);
}
Collections.sort(pointList, new Comparator<Point>(){
@Override
public int compare(final Tramo lhs, final Tramo rhs) {
return distances.get(lhs.getId()).compareTo(distances.get(rhs.getId()));
}
});
return pointList
}
private double calcDistance(LatLng ll1, LatLng ll2){
final double lat1 = ll1.latitude;
final double lon1 = ll1.longitude;
final double lat2 = ll2.latitude;
final double lon2 = ll2.longitude;
final double lat = lat2-lat1;
final double lon = lon2-lon1;
final double squareLat = lat*lat;
final double squareLon = lon*lon;
final double squareDistance = squareLat+squareLon;
return squareDistance;
}
calcDistance
実際には、2 点間の実際の距離の 2 乗を返します。これは、2 乗を比較すると実際の値を比較した場合と同じ結果が得られると考えたためであり、その平方根を作成する必要がなかったため、はるかに高速でした。
ただし、まだ遅い (リストが長い) ため、プロセスを加速するためのアイデアをいただければ幸いです。並べ替える前に距離を事前に計算するので、各距離を複数回計算することはありませんが、他の改善は考えられません。足りないものはありますか?