Advertisement
popovstefan

[NP 2 kol.] Merna stanica

Dec 2nd, 2018
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.37 KB | None | 0 0
  1. Opened: 711 дена
  2. Мерна станица (35 поени) Problem 2 (1 / 26)
  3. Во една метеролошка станица на секои 5 минути пристигнуваат податоци за временските услови (температура, влажност на воздухот, ветар, видливост, време). Пример за вакви податоци:
  4.  
  5. температура: 13 степени
  6. влажност: 98%
  7. ветар: 11.2 km/h
  8. видливост: 14 km
  9. време: 28.12.2013 14:37:55 (dd.MM.yyyy HH:mm:ss).
  10. Потребно е да се имплементира класа WeatherStation која ќе ги чува податоците за временските услови за последните x денови (при додавање на податоци за ново мерење, сите мерења чие што време е постаро за x денови од новото се бришат ). Исто така ако времето на новото мерење кое се додава се разликува за помалку од 2.5 минути од времето на некое претходно додадено мерење, тоа треба да се игнорира (не се додава).
  11.  
  12. Да се имплементираат следните методи на класата WeatherStation:
  13.  
  14. WeatherStation(int days) - конструктор со аргумент бројот на денови за кои се чуваат мерења
  15. public void addMeasurment(float temperature, float wind, float humidity, float visibility, Date date) - додавање на податоци за ново мерење
  16. public int total() - го враќа вкупниот број на мерења кои се чуваат
  17. public void status(Date from, Date to) - ги печати сите мерења во периодот од from до to подредени според датумот во растечки редослед и на крај ја печати просечната температура во овој период. Ако не постојат мерења во овој период се фрла исклучок од тип RuntimeException (вграден во Јава).
  18. Пример за форматот на излезот:
  19.  
  20. 24.6 80.2 km/h 28.7% 51.7 km Tue Dec 17 23:40:15 CET 2013
  21. 23.5 32.2 km/h 16.5% 187.2 km Tue Dec 17 23:45:15 CET 2013
  22. 13.2 67.1 km/h 18.9% 135.4 km Tue Dec 17 23:50:15 CET 2013
  23. Avarage temperature: 20.43
  24. ======================================================================================================
  25.  
  26.  
  27. import java.text.DateFormat;
  28. import java.text.ParseException;
  29. import java.text.SimpleDateFormat;
  30. import java.util.Date;
  31. import java.util.Iterator;
  32. import java.util.Scanner;
  33. import java.util.Set;
  34. import java.util.TreeSet;
  35. import java.util.function.Predicate;
  36. import java.util.stream.Collectors;
  37.  
  38. class Measurment implements Comparable<Measurment>{
  39.     float temperature, wind, humidity, visibility;
  40.     Date date;
  41.    
  42.     Measurment(float temperature, float wind, float humidity, float visibility, Date date) {
  43.         this.temperature = temperature;
  44.         this.wind = wind;
  45.         this.humidity = humidity;
  46.         this.visibility = visibility;
  47.         this.date = date;
  48.     }
  49.    
  50.     boolean isEqual(Date date) {
  51.         long secs1 = this.date.getTime() / 1000;
  52.         long secs2 = date.getTime() / 1000;
  53.         return Math.abs(secs1 - secs2) < 150;
  54.     }
  55.    
  56.     boolean isEarlierThan(Date date, int x) {
  57.         long time1 = this.date.getMonth() * 31 + this.date.getDate();
  58.         long time2 = date.getMonth() * 31 + date.getDate();
  59.         long diff = time2 - time1;
  60.         return diff >= x;
  61.     }
  62.    
  63.     @Override
  64.     public String toString() {
  65.         return String.format("%.1f %.1f km/h %.1f%% %.1f km %s",
  66.                 temperature, wind, humidity, visibility, date.toString());        
  67.     }
  68.  
  69.     @Override
  70.     public int compareTo(Measurment arg0) {
  71.         if (this.isEqual(arg0.date))
  72.             return 0;
  73.         else
  74.             return date.compareTo(arg0.date);
  75.     }
  76. }
  77.  
  78. class WeatherStation {
  79.     TreeSet<Measurment> measures;
  80.     int days;
  81.     WeatherStation(int days) {
  82.         this.measures = new TreeSet<>();
  83.         this.days = days;
  84.     }
  85.    
  86.     void addMeasurment(float temp, float wind, float humid, float visible, Date date) {
  87.         Measurment toAdd = new Measurment(temp, wind, humid, visible, date);
  88.         if (! measures.add(toAdd))
  89.             return;
  90.        
  91.         Iterator<Measurment> it = measures.iterator();
  92.        
  93.         while (it.hasNext()) {
  94.             Measurment current = it.next();
  95.             if (current.isEarlierThan(date, days)) {
  96.                 it.remove();
  97.             }
  98.         }
  99.        
  100.     }
  101.    
  102.     int total() {
  103.         return measures.size();
  104.     }
  105.    
  106.     void status(Date from, Date to) {
  107.                 Predicate<Measurment> predicate =measure ->
  108.         ! (measure.date.after(to) || measure.date.before(from));
  109.        
  110.         Set<Measurment> localSet =
  111.                 measures.stream()
  112.                 .filter(predicate)
  113.                 .collect(Collectors.toSet());
  114.         if (! localSet.isEmpty()) {
  115.             localSet.stream().sorted().forEach(System.out :: println);
  116.             double avgTemp = localSet.stream()
  117.                     .mapToDouble(t -> t.temperature)
  118.                     .average()
  119.                     .getAsDouble();
  120.             System.out.println(String.format("Average temperature: %.2f", avgTemp));
  121.         }
  122.         else {
  123.             throw new RuntimeException();
  124.         }
  125.     }
  126. }
  127. public class WeatherStationTest {
  128.     public static void main(String[] args) throws ParseException {
  129.         Scanner scanner = new Scanner(System.in);
  130.         DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
  131.         int n = scanner.nextInt();
  132.         scanner.nextLine();
  133.         WeatherStation ws = new WeatherStation(n);
  134.         while (true) {
  135.             String line = scanner.nextLine();
  136.             if (line.equals("=====")) {
  137.                 break;
  138.             }
  139.             String[] parts = line.split(" ");
  140.             float temp = Float.parseFloat(parts[0]);
  141.             float wind = Float.parseFloat(parts[1]);
  142.             float hum = Float.parseFloat(parts[2]);
  143.             float vis = Float.parseFloat(parts[3]);
  144.             line = scanner.nextLine();
  145.             Date date = df.parse(line);
  146.             ws.addMeasurment(temp, wind, hum, vis, date);
  147.         }
  148.         String line = scanner.nextLine();
  149.         Date from = df.parse(line);
  150.         line = scanner.nextLine();
  151.         Date to = df.parse(line);
  152.         scanner.close();
  153.         System.out.println(ws.total());
  154.         try {
  155.             ws.status(from, to);
  156.         } catch (RuntimeException e) {
  157.             System.out.println(e);
  158.         }
  159.     }
  160. }
  161.  
  162. ==============================================================================================================
  163. Sample input
  164. 5
  165. 22.1 18.9 1.3 24.6
  166. 10.12.2013 21:30:15
  167. 22.1 18.9 1.3 24.6
  168. 11.12.2013 22:30:15
  169. 22.1 18.9 1.3 24.6
  170. 17.12.2013 23:30:15
  171. 41.8 9.4 40.8 20.7
  172. 17.12.2013 23:35:15
  173. 24.6 28.7 80.2 51.7
  174. 17.12.2013 23:40:15
  175. 24.6 28.7 80.2 51.7
  176. 17.12.2013 23:40:25
  177. 24.6 28.7 80.2 51.7
  178. 17.12.2013 23:39:36
  179. 23.5 16.5 32.2 187.2
  180. 17.12.2013 23:45:15
  181. 13.2 18.9 67.1 135.4
  182. 17.12.2013 23:50:15
  183. 13.2 18.9 67.1 135.4
  184. 17.12.2013 23:51:12
  185. 31.6 48.3 6.0 86.6
  186. 17.12.2013 23:55:15
  187. 18.0 37.6 15.9 37.7
  188. 18.12.2013 00:00:15
  189. =====
  190. 17.12.2013 23:35:15
  191. 17.12.2013 23:50:15
  192.  
  193. ===================================================================================================================
  194. Sample output
  195. 7
  196. 41.8 9.4 km/h 40.8% 20.7 km Tue Dec 17 23:35:15 GMT 2013
  197. 24.6 28.7 km/h 80.2% 51.7 km Tue Dec 17 23:40:15 GMT 2013
  198. 23.5 16.5 km/h 32.2% 187.2 km Tue Dec 17 23:45:15 GMT 2013
  199. 13.2 18.9 km/h 67.1% 135.4 km Tue Dec 17 23:50:15 GMT 2013
  200. Average temperature: 25.77
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement