Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package pp1; import java.util.ArrayList; import java.util.List; import java.util.PriorityQueue; import java.util.stream.Collectors; import java.util.stream.Stream; import org.pi4.locutil.GeoPosition; import org.pi4.locutil.PositioningError; import org.pi4.locutil.Random; import org.pi4.locutil.Statistics; import org.pi4.locutil.trace.TraceEntry; import com.google.common.collect.MinMaxPriorityQueue; import com.google.common.collect.Ordering; /** * * @author Kris */ public class KNNPositioner implements Positioner { int k; public KNNPositioner(int k) { this.k = k; } @Override public List<PositioningError> getPositions(List<TraceEntry> offline, List<TraceEntry> online, Distancer distancer) { List<PositioningError> results = new ArrayList<>(); /*online.stream().forEach((trace) -> { List<GeoPosition> bestTargets = offline.stream() .sorted((TraceEntry t1, TraceEntry t2) -> distancer.compareByDistance(t1, t2, trace)) .limit(k).map(TraceEntry::getGeoPosition).collect(Collectors.toList()); results.add(new PositioningError(trace.getGeoPosition(), Statistics.avgPosition(bestTargets) )); });*/ //Soooooo sloooow online.stream().forEach((TraceEntry trace) -> { //define ordering of TraceEntries by distance Ordering<TraceEntry> O = new Ordering<TraceEntry>() { public int compare(TraceEntry t1, TraceEntry t2) { return distancer.compareByDistance(t1, t2, trace); } }; //find closest TraceEntries as a stream Stream<TraceEntry> leastDistanceTraceEntryStream = O.leastOf(offline, k).stream(); //convert result of stream to a list of GeoPositions List<GeoPosition> leastDistancePositionsList = leastDistanceTraceEntryStream .map(TraceEntry::getGeoPosition).collect(Collectors.toList()); //find average position GeoPosition avgPosition = Statistics.avgPosition(leastDistancePositionsList); //add to resultset results.add(new PositioningError(trace.getGeoPosition(), avgPosition)); }); return results; } }