Advertisement
dzocesrce

[NP] Weather Station

Apr 18th, 2025
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.65 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Date;
  3. import java.util.List;
  4. import java.util.stream.Collectors;
  5. import java.text.DateFormat;
  6. import java.text.ParseException;
  7. import java.text.SimpleDateFormat;
  8. import java.util.Date;
  9. import java.util.Scanner;
  10.  
  11. public class WeatherStationTest {
  12.     public static void main(String[] args) throws ParseException {
  13.         Scanner scanner = new Scanner(System.in);
  14.         DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
  15.         int n = scanner.nextInt();
  16.         scanner.nextLine();
  17.         WeatherStation ws = new WeatherStation(n);
  18.         while (true) {
  19.             String line = scanner.nextLine();
  20.             if (line.equals("=====")) break;
  21.  
  22.             String[] parts = line.split(" ");
  23.             float temp = Float.parseFloat(parts[0]);
  24.             float wind = Float.parseFloat(parts[1]);
  25.             float hum = Float.parseFloat(parts[2]);
  26.             float vis = Float.parseFloat(parts[3]);
  27.  
  28.             String dateLine = scanner.nextLine();
  29.             Date date = df.parse(dateLine);
  30.  
  31.             ws.addMeasurment(temp, wind, hum, vis, date);
  32.         }
  33.  
  34.         Date from = df.parse(scanner.nextLine());
  35.         Date to = df.parse(scanner.nextLine());
  36.  
  37.         System.out.println(ws.total());
  38.         try {
  39.             ws.status(from, to);
  40.         } catch (RuntimeException e) {
  41.             System.out.println(e);
  42.         }
  43.     }
  44. }
  45.  
  46. class Measurment {
  47.     float temp, wind, hum, vis;
  48.     Date date;
  49.  
  50.     public Measurment(float temp, float wind, float hum, float vis, Date date) {
  51.         this.temp = temp;
  52.         this.wind = wind;
  53.         this.hum = hum;
  54.         this.vis = vis;
  55.         this.date = date;
  56.     }
  57.  
  58.     public Date getDate() {
  59.         return date;
  60.     }
  61.  
  62.     public float getTemp() {
  63.         return temp;
  64.     }
  65.  
  66.     @Override
  67.     public String toString() {
  68.         return String.format("%.1f %.1f km/h %.1f%% %.1f km %s", temp, wind, hum, vis, date);
  69.     }
  70. }
  71.  
  72. class WeatherStation {
  73.     private final List<Measurment> measurments = new ArrayList<>();
  74.     private final int previousDays;
  75.     private static final long MILLS_IN_DAY = 1000L * 60 * 60 * 24;
  76.     private static final long TWO_AND_HALF_MINUTES = 150000L;
  77.  
  78.     public WeatherStation(int days) {
  79.         this.previousDays = days;
  80.     }
  81.  
  82.     public void addMeasurment(float temp, float wind, float hum, float vis, Date date) {
  83.         // Remove outdated measurements (older than x days from current)
  84.         measurments.removeIf(m -> date.getTime() - m.getDate().getTime() > previousDays * MILLS_IN_DAY);
  85.  
  86.         // Check for duplicate measurements within 2.5 minutes
  87.         for (Measurment m : measurments) {
  88.             long diff = Math.abs(date.getTime() - m.getDate().getTime());
  89.             if (diff < TWO_AND_HALF_MINUTES) return; // Ignore this measurement
  90.         }
  91.  
  92.         // Add new measurement
  93.         measurments.add(new Measurment(temp, wind, hum, vis, date));
  94.     }
  95.  
  96.     public int total() {
  97.         return measurments.size();
  98.     }
  99.  
  100.     public void status(Date from, Date to) {
  101.         List<Measurment> filtered = measurments.stream()
  102.                 .filter(m -> !m.getDate().before(from) && !m.getDate().after(to))
  103.                 .sorted(Comparator.comparing(Measurment::getDate))
  104.                 .collect(Collectors.toList());
  105.  
  106.         if (filtered.isEmpty())
  107.             throw new RuntimeException();
  108.  
  109.         double avgTemp = filtered.stream().mapToDouble(Measurment::getTemp).average().orElse(0);
  110.  
  111.         for (Measurment m : filtered)
  112.             System.out.println(m);
  113.  
  114.         System.out.printf("Average temperature: %.2f\n", avgTemp);
  115.     }
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement