Hallo Leute.
Ich bemühe mich nun schon seit zwei Tagen einen Algorithums zu schreiben, der mir maximal 10 Straßenabschnitte anhand ihrer Luftliniendistanzen in einer Liste (top10List)speichert. Das Ding ist, dass alle Straßenabschnitte einander eine Distanz > 10 km aufweisen sollen. Als Basis liegt mir eine Liste (allDsegs) mit ca 250.000 Straßenabschnitten vor, welche vorher schon bearbeitet wurde.
Über die allMatch-Methode von Apache prüfe ich in der top10List, die sich nach und nach mit weiteren Straßenabschnitten füllt, ob ein neu hinzugefügter Abschnitt eine Distanz > 10 km gegenüber allen Abschnitten innerhalb der top10List aufweist.
Mein Problem besteht nun darin, dass die allMatch() nicht alle, sondern doch nur einen Wert auf das "matching" prüft.
Folgendes Skript liegt mir zu Grunde:
In einem weiteren Post präsentiere ich noch die Basisdaten und die Logdatei. Somit ist mein Anliegen besser nachvollziehbar.
Ich bemühe mich nun schon seit zwei Tagen einen Algorithums zu schreiben, der mir maximal 10 Straßenabschnitte anhand ihrer Luftliniendistanzen in einer Liste (top10List)speichert. Das Ding ist, dass alle Straßenabschnitte einander eine Distanz > 10 km aufweisen sollen. Als Basis liegt mir eine Liste (allDsegs) mit ca 250.000 Straßenabschnitten vor, welche vorher schon bearbeitet wurde.
Über die allMatch-Methode von Apache prüfe ich in der top10List, die sich nach und nach mit weiteren Straßenabschnitten füllt, ob ein neu hinzugefügter Abschnitt eine Distanz > 10 km gegenüber allen Abschnitten innerhalb der top10List aufweist.
Mein Problem besteht nun darin, dass die allMatch() nicht alle, sondern doch nur einen Wert auf das "matching" prüft.
Folgendes Skript liegt mir zu Grunde:
Java:
private static List<Top10Dsegs> getTop10DSEGs() throws IOException {
List<File>rFiles = getRFiles();
List<String> allDsegs = loadDsegRanking(rFiles);
List<Top10Dsegs> top10List = new ArrayList<>();
double startLat_allDsegs, startLon_allDsegs;
double startLat_top10List, startLon_top10List;
String[] listArray;
//declaring the starting dseg and its coordinates
String startEntry = allDsegs.get(0);
Top10Dsegs firstEntry = new Top10Dsegs(startEntry);
top10List.add(firstEntry);
System.out.println("Iteration starts here!\n---------------------");
//begin to iterate over all entries (just ranked)
for(String line : allDsegs){
boolean check=false;
Top10Dsegs nextEntry=null;
//structure from allDsegs:
//DSEG,startLat,startLon
//1231231231231231231, 54.123, 8.456
listArray = line.split(",");
startLat_allDsegs = Double.valueOf(listArray[1]);
startLon_allDsegs = Double.valueOf(listArray[2]);
//start to check if line-entry of allDsegs has a distance > 10 km compared to given Dsegs
for(Top10Dsegs entry : top10List){
startLat_top10List = entry.getStartLat();
startLon_top10List = entry.getStartLon();
//the DistanceCalculator calculates the distance between the dseg from allDsegs and the other dseg from top10List
DistanceCalculator distanceCalculator = new DistanceCalculator();
Double dist = distanceCalculator.distance(startLat_top10List, startLon_top10List, startLat_allDsegs, startLon_allDsegs, "K");
System.out.println("Checked Dseg: " + listArray[0]);
System.out.println("Distance between checked Dseg and " + entry.getSegmentID() + " = " + dist);
//check if there is a dseg from allDsegs distance > 10 km compared to ALL OTHER dsegs
check = top10List.stream().allMatch(x->dist>10);
System.out.println("Are there distances > 10 ? \t" + check);
//if check is true, the dseg from allDsegs will be added to the top10List
if(check==true){
nextEntry = new Top10Dsegs(listArray[0]+","+listArray[1]+","+listArray[2]);
}
}
if(check==true && top10List.size()<10){
top10List.add(nextEntry);
}
System.out.println("Progress: \n"+top10List.size()+" entries inside top 10 list. \n<---------------->\nNext Iteration:");
}
return top10List;
}
In einem weiteren Post präsentiere ich noch die Basisdaten und die Logdatei. Somit ist mein Anliegen besser nachvollziehbar.