直線距離のための特別な勾配については、マップに格納されている他のすべての点に対して、指定された緯度/経度が10kmを超える新しい点を確認する必要があります。私は、マップ内のすべての点が順次比較されることを避けたいと思います。1つの値をすべてのリスト項目と1ステップで比較するにはどうすればよいですか?
私は、次のコードを試してみました:
private static Map<Long,String> getTop10DSEGs() throws IOException {
Map<Long,String> top10Dsegs = new HashMap<>();
List<String> allDsegs = loadDsegRanking(rFiles);
//the list allDsegs is a csv with the following structure
//dsegID, Latitide, Longitude
//1167317891449551556,51.435550689697266,6.695819854736328
double LatFromList, LonFromList;
double LatFromMap, LonFromMap;
String[] listArray;
String[] mapArray;
Long firstDseg = Long.parseLong(allDsegs.get(0).substring(0, 19));
top10Dsegs.put(firstDseg, allDsegs.get(0).substring(20));
//Iterating through all dsegs
for(String line : allDsegs){
Long nextID = null;
String nextCoordinates = "0.0000,0.0000";
listArray = line.split(",");
LatFromList = Double.valueOf(listArray[1]);
LonFromList = Double.valueOf(listArray[2]);
//checking all coordinates of maped dsegs
for(Map.Entry<Long, String> entry : top10Dsegs.entrySet()){
List<Double> distanceList = new ArrayList<>();
mapArray = entry.getValue().split(",");
LatFromMap = Double.valueOf(mapArray[0]);
LonFromMap = Double.valueOf(mapArray[1]);
//calculating the distance between the next city from the list and the other dsegs from the map
//result of dist is a double and it's metric is Km.
Double dist = Implements.DistanceCalculator.distance(LatFromMap, LonFromMap, LatFromList, LonFromList, "K");
distanceList.add(dist);
for(Double value : distanceList){
if (dist>10){
nextID = Long.parseLong(listArray[0]);
nextCoordinates = listArray[1] + "," + listArray[2];
}
}
}
if(nextID != null && top10Dsegs.size() < 10){
top10Dsegs.put(nextID, nextStartCoordinates);
}
return top10Dsegs;
}
本当にいいアルゴリズムです –
(1)「1ステップで」とは何ですか? (2)ポイントのリストや*「新しいポイント」をチェックする必要がありますか?それがリストであれば、何とかソートされていますか? (3)どのマップがポイントを格納し、キーと値は何を表していますか? (4)なぜ「地図内のすべての点が順番に比較される」*を避けたいのですか? (4)そのマップはどのくらいの頻度で変更されますか? (5)ストリームを使用できますか? – user1803551
最初のリストをソートすることで、ポイントをより早く削除するのに大いに役立ちます... –