Filip_Markoski

[NP] WeatherStation

Dec 23rd, 2017
421
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.46 KB | None | 0 0
  1. import java.text.DateFormat;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.time.LocalDateTime;
  5. import java.time.format.DateTimeFormatter;
  6. import java.time.temporal.ChronoUnit;
  7. import java.util.Comparator;
  8. import java.util.Date;
  9. import java.util.Scanner;
  10. import java.util.TreeSet;
  11. import java.util.function.Predicate;
  12.  
  13. public class WeatherStationTest {
  14.     public static void main(String[] args) throws ParseException {
  15.         Scanner scanner = new Scanner(System.in);
  16.         DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
  17.         int n = scanner.nextInt();
  18.         scanner.nextLine();
  19.         WeatherStation ws = new WeatherStation(n);
  20.         while (true) {
  21.             String line = scanner.nextLine();
  22.             if (line.equals("=====")) {
  23.                 break;
  24.             }
  25.             String[] parts = line.split(" ");
  26.             float temp = Float.parseFloat(parts[0]);
  27.             float wind = Float.parseFloat(parts[1]);
  28.             float hum = Float.parseFloat(parts[2]);
  29.             float vis = Float.parseFloat(parts[3]);
  30.             line = scanner.nextLine();
  31.             LocalDateTime date = LocalDateTime.parse(line, timeFormatter);
  32.             ws.addMeasurement(temp, wind, hum, vis, date);
  33.         }
  34.         String line = scanner.nextLine();
  35.         LocalDateTime from = LocalDateTime.parse(line, timeFormatter);
  36.         line = scanner.nextLine();
  37.         LocalDateTime to = LocalDateTime.parse(line, timeFormatter);
  38.         scanner.close();
  39.         System.out.println(ws.total());
  40.         try {
  41.             ws.status(from, to);
  42.         } catch (RuntimeException e) {
  43.             System.out.println(e);
  44.         }
  45.     }
  46. }
  47.  
  48. class WeatherStation {
  49.  
  50.     TreeSet<Measurement> measurements;
  51.     int days;
  52.  
  53.     WeatherStation(int days) {
  54.         this.days = days;
  55.         measurements = new TreeSet<>();
  56.     }
  57.  
  58.     public void addMeasurement(float temperature, float wind, float humidity, float visibility, LocalDateTime date) {
  59.         Measurement measurement = new Measurement(temperature, wind, humidity, visibility, date);
  60.         if (!measurements.add(measurement)) {
  61.             return;
  62.         }
  63.  
  64.         Predicate<Measurement> isOld = m -> m.date.minusDays(days).isAfter(date);
  65.  
  66.         measurements.removeIf(isOld);
  67.     }
  68.  
  69.     public int total() {
  70.         return measurements.size();
  71.     }
  72.  
  73.     public void status(LocalDateTime from, LocalDateTime to) {
  74.         /* Apparently this is wrong.. */
  75.         //Predicate<Measurement> isInRange = (measurement -> measurement.date.isAfter(from) && measurement.date.isBefore(to));
  76.         Predicate<Measurement> isInRange = measurement -> !(measurement.date.isBefore(from) || measurement.date.isAfter(to));
  77.         measurements.stream()
  78.                 .filter(isInRange)
  79.                 .forEach(System.out::println);
  80.  
  81.         double avgTemperature = measurements.stream()
  82.                 .filter(isInRange)
  83.                 .mapToDouble(Measurement::getTemperature)
  84.                 .average()
  85.                 .orElse(0);
  86.  
  87.         System.out.printf("Average temperature: %.2f\n", avgTemperature);
  88.     }
  89.  
  90.     public double avgTemperature() {
  91.         return measurements.stream()
  92.                 .mapToDouble(Measurement::getTemperature)
  93.                 .average()
  94.                 .orElse(0);
  95.     }
  96.  
  97. }
  98.  
  99. class Measurement implements Comparable<Measurement> {
  100.     float temperature;
  101.     float wind;
  102.     float humidity;
  103.     float visibility;
  104.     LocalDateTime date;
  105.  
  106.     public Measurement(float temperature, float wind, float humidity, float visibility, LocalDateTime date) {
  107.         this.temperature = temperature;
  108.         this.wind = wind;
  109.         this.humidity = humidity;
  110.         this.visibility = visibility;
  111.         this.date = date;
  112.     }
  113.  
  114.     public float getTemperature() {
  115.         return temperature;
  116.     }
  117.  
  118.     @Override
  119.     public int compareTo(Measurement that) {
  120.         /* 2.5 minutes = 120 sec + 30 sec = 150 sec */
  121.         long span = Math.abs(that.date.until(this.date, ChronoUnit.SECONDS));
  122.         if (span < 150) {
  123.             return 0;
  124.         }
  125.         return this.date.compareTo(that.date);
  126.     }
  127.  
  128.     @Override
  129.     public String toString() {
  130.         //DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E L ");
  131.         //dtf.format(
  132.         return String.format("%.1f %.1f km/h %.1f%% %.1f km %s", temperature,
  133.                 wind, humidity, visibility, date);
  134.     }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment