Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import java.util.stream.Collectors;
- import java.text.DateFormat;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Scanner;
- public class WeatherStationTest {
- public static void main(String[] args) throws ParseException {
- Scanner scanner = new Scanner(System.in);
- DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
- int n = scanner.nextInt();
- scanner.nextLine();
- WeatherStation ws = new WeatherStation(n);
- while (true) {
- String line = scanner.nextLine();
- if (line.equals("=====")) break;
- String[] parts = line.split(" ");
- float temp = Float.parseFloat(parts[0]);
- float wind = Float.parseFloat(parts[1]);
- float hum = Float.parseFloat(parts[2]);
- float vis = Float.parseFloat(parts[3]);
- String dateLine = scanner.nextLine();
- Date date = df.parse(dateLine);
- ws.addMeasurment(temp, wind, hum, vis, date);
- }
- Date from = df.parse(scanner.nextLine());
- Date to = df.parse(scanner.nextLine());
- System.out.println(ws.total());
- try {
- ws.status(from, to);
- } catch (RuntimeException e) {
- System.out.println(e);
- }
- }
- }
- class Measurment {
- float temp, wind, hum, vis;
- Date date;
- public Measurment(float temp, float wind, float hum, float vis, Date date) {
- this.temp = temp;
- this.wind = wind;
- this.hum = hum;
- this.vis = vis;
- this.date = date;
- }
- public Date getDate() {
- return date;
- }
- public float getTemp() {
- return temp;
- }
- @Override
- public String toString() {
- return String.format("%.1f %.1f km/h %.1f%% %.1f km %s", temp, wind, hum, vis, date);
- }
- }
- class WeatherStation {
- private final List<Measurment> measurments = new ArrayList<>();
- private final int previousDays;
- private static final long MILLS_IN_DAY = 1000L * 60 * 60 * 24;
- private static final long TWO_AND_HALF_MINUTES = 150000L;
- public WeatherStation(int days) {
- this.previousDays = days;
- }
- public void addMeasurment(float temp, float wind, float hum, float vis, Date date) {
- // Remove outdated measurements (older than x days from current)
- measurments.removeIf(m -> date.getTime() - m.getDate().getTime() > previousDays * MILLS_IN_DAY);
- // Check for duplicate measurements within 2.5 minutes
- for (Measurment m : measurments) {
- long diff = Math.abs(date.getTime() - m.getDate().getTime());
- if (diff < TWO_AND_HALF_MINUTES) return; // Ignore this measurement
- }
- // Add new measurement
- measurments.add(new Measurment(temp, wind, hum, vis, date));
- }
- public int total() {
- return measurments.size();
- }
- public void status(Date from, Date to) {
- List<Measurment> filtered = measurments.stream()
- .filter(m -> !m.getDate().before(from) && !m.getDate().after(to))
- .sorted(Comparator.comparing(Measurment::getDate))
- .collect(Collectors.toList());
- if (filtered.isEmpty())
- throw new RuntimeException();
- double avgTemp = filtered.stream().mapToDouble(Measurment::getTemp).average().orElse(0);
- for (Measurment m : filtered)
- System.out.println(m);
- System.out.printf("Average temperature: %.2f\n", avgTemp);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement