Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package dailyprogrammer.medium.averagespeedcameras;
- import java.io.File;
- import java.time.Duration;
- import java.time.LocalTime;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import java.util.stream.IntStream;
- public class SpeedCalculator {
- private LogParser parser;
- private List<CameraLog> cameras;
- SpeedCalculator() {
- this.parser = new LogParser();
- }
- public List<Pair<String, Double>> getSpeedingCars(File logFile) throws Exception {
- parser.parseLog(logFile);
- cameras = parser.getCameras();
- List<Pair<String, Double>> ret = Collections.synchronizedList(new ArrayList<>());
- parser.getCars().stream().parallel()
- .forEach(car -> checkSpeed(car, parser.getDistMeasure(), ret));
- return ret;
- }
- private void checkSpeed(String car, LogParser.DistMeasure distMeasure, List<Pair<String, Double>> lst) {
- IntStream.range(0, cameras.size() - 1).forEach(i -> {
- CameraLog cam1 = cameras.get(i);
- CameraLog cam2 = cameras.get(i + 1);
- LocalTime time1 = cam1.getCarPassTime(car);
- LocalTime time2 = cam2.getCarPassTime(car);
- double div = distMeasure == LogParser.DistMeasure.KM ? 1000.0 : 1609.0;
- double camDist = (cam2.getDist() - cam1.getDist()) / div;
- double duration = Duration.between(time1, time2).toNanos() / 1e9 / 60.0 / 60.0;
- double speed = camDist / duration;
- if (speed > parser.getSpeedLimit()) lst.add(new Pair<>(car, speed - parser.getSpeedLimit()));
- });
- }
- public String getDistString() {
- return parser.getDistMeasure() == LogParser.DistMeasure.KM ? "km/h" : "mph";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement