ÖVNINGSUPPGIFT

Uppgift 10 - Väderdata

Försök själv först. Ledtrådar och facit finns längre ner – helt utan inloggning.


Nyckelord: ArrayLists

Väderdata

I den här uppgiften ska vi testa att arbeta med ArrayLists. Vi kommer utgå från ett befintligt projekt och bygga metoder utifrån det.

Projektet vi ska arbeta i nu går att ladda ner här. Självklart finns det också lösningsförslag tillgängligt vid slutet av sidan. Vi rekommenderar dock starkt att inte kolla på lösningsförslaget direkt när du fastnar. Försök tänka igenom noggrant hur du kan lösa uppgiften. Du lär dig bäst om du kommer på din egna lösning på uppgiften!

Uppgift 1 - Bekanta dig med programskelettet

Vi börjar med att bekanta oss med programskelettet. I zip-filen finns tre filer som vi utgår ifrån.

  • main – Detta är huvudfilen som vi kommer koda ifrån.
  • LoadData – Är en klass som läser in data från en CSV-fil och sparar datan i olika Arraylists. Du behöver inte röra denna fil, den använder vi enbart som en hjälpklass för att enkelt komma igång med uppgifterna. Men du får självklart gärna gå in och bekanta dig med klassen om du vill veta hur det fungerar, men det är inte en del av denna uppgift.
  • vaderdata.csv – Detta är en csv-fil som innehåller data från en väderstation. Väderstationen har sparat mätdata en gång var 10:de minut under hela 2019. Det är denna data vi nu ska arbeta med. Datan som finns tillgänglig är tidpunkt, lufttryck, temperatur samt mängden regn under en 10-minutsperiod.

Bekanta dig med koden i main-filen.

import java.util.ArrayList;
public class main {
    public static void main(String[] args) {
        /* Ange länken till vaderdata.csv genom att högerklicka på vaderdata.csv och trycka "Copy Path".
        *  Klistra sedan in länken under csvFile.
        */
        String csvFile = "vaderdata.csv";
        // Läser in all väderdata
        LoadData data = new LoadData(csvFile);
        //Sparar undan väderdatan i fyra olika arraylists
        ArrayList<String> timestamps = data.getTimestamps();
        ArrayList<Double> barometer = data.getBarometer();
        ArrayList<Double> temp = data.getTemp();
        ArrayList<Double> rain = data.getRain();
        //Skriv ut exempeldata
        System.out.println( "Exempeldata - Tid: " + timestamps.get(0) +
                ", Barometer: " + barometer.get(0) +
                ", Temperatur: " + temp.get(0) +
                ", Mängd regn: " + rain.get(0));
    }
}

Programskelettet laddar in data från väderfilen och sparar ner datan i fyra olika arraylists, timestamp, barometer, temp och rain. Observera datatypen för varje arraylist!

Du behöver uppdatera länken till variabeln csvFile så den stämmer överens med var du sparade projektet på din dator (rad 10). Enklaste sättet är att högerklicka på vaderdata.csv och trycka på “Copy Path”. Klistra in adressen i variablen csvFile. Glöm inte att adressen ska sparas som en String.

Din variabel borde se ut något i stil med:

String csvFile = "/Users/codebean/vaderdata.csv";

Kör programmet. Programskelettet skriver ut exempeldata:

Exempeldata - Tid: 1546300800, Barometer: 1011.72, Temperatur: 6.5, Mängd regn: 0.0254

Detta betyder att vid tiden 1546300800 var lufttrycket 1011,72 hPa, temperaturen var 6,5° C och totala mängden regn under denna 10-minutersperiod var 0,0254 mm

Tiden är ett så kallat unix timestamp som är vanligt förekommande inom programmering. Det är helt enkelt antal sekunder som har gått sedan 1:e Januari 1970 klockan 00:00.

Uppgift 2 - Antal mätpunkter

Du har fyra stycken ArrayLists, timestamps, barometer, temp samt rain. Vi ska nu se hur vi kan arbeta med ArrayLists när vi har mycket data. Varje index i listan tillhör samma mätpunkt. Exempelvis, index 0 i varje ArrayList tillhör samma tidpunkt. Varje ArrayList är alltså lika stora.

Skriv en metod som returnerar antal mätpunkter som finns i varje ArrayList. Jämför med svaret under Kontrollera ditt svar.

Observera att alla listor är lika stora.

Kontrollera ditt svar

Rätt svar: 52546


Uppgift 3 - Maxtemperatur

Skriv en metod som returnerar maxtemperaturen under 2019. Datan som finns sträcker sig enbart mellan 1 januari till 31 december så du behöver inte kontrollera datumintervallet. Avrunda till till två decimalers noggrannhet, exempelvis "25,67". Observera kommatecknet och inte punkt.

Kontrollera ditt svar

Rätt svar: 32,17


Uppgift 4 - Datum

Vilket datum uppnåddes maxtemperaturen? Använd svaret i uppgift 3 för att avgöra datumet. Svara i formatet "yyyy-MM-dd HH:mm".

Pssst, du kan använda följande metod för att konvertera ett timestamp till ett datum:

    // Konverterar ett timestamp till ett datum
    private static java.util.Date getDateByTimestamp(String maxTempTimestamp){
        return new java.util.Date((long)Long.parseLong(maxTempTimestamp)*1000);
    }
Kontrollera ditt svar

Rätt svar: 2019-06-30 14:20


Uppgift 5 - Summera värden

Hur mycket regnade det totalt under 2019? Svara med två decimalers noggrannhet, exempelvis "123,45". Observera kommatecknet och inte punkt.

Kontrollera ditt svar

Rätt svar: 671,40


Uppgift 6 - Lägsta lufttryck

Vilket datum var det lägsta uppmätta lufttrycket? Svara i formatet "yyyy-MM-dd HH:mm".

Kontrollera ditt svar

Rätt svar: 2019-03-04 20:30


Uppgift 7 - Medeltemperatur

Vad var medeltemperaturen i den bifogade datan? Ange svaret med två decimaler.

Kontrollera ditt svar

Rätt svar: 9,81


Lösningar

Grymt jobbat! Har du kommit hit ner har du förhoppningsvis löst alla uppgifter! Men, har du inte fått det ännu så får du självklart tjuvkika på svaret. Vi vill dock återigen uppmuntra om att inte kolla på lösningarna för tidigt. Genom att försöka flera gånger och hitta en egen väg till lösningen, så lär man sig helt klart bäst!

Lösning

Ladda ner programskelettet, väderdatan och ett komplett lösningsförslag. Koden finns även som VaderdataLosning.java.

Kompilera med javac -encoding UTF-8 LoadData.java VaderdataLosning.java och kör med java VaderdataLosning vaderdata.csv.

Datum anges i svensk lokal tid (Europe/Stockholm). Jämför gärna din egen lösning med koden först när du har försökt själv.

Fler uppgifter

Datumfrågornas svar använder Europe/Stockholm. Unix-tid räknas från 1970-01-01 00:00:00 UTC. Använd originalvärdet för maxtemperaturen eller dess index när du söker datum; det avrundade visningsvärdet 32,17 behöver inte finnas exakt i listan. Datan har 52 546 rader och kan innehålla luckor; medelvärdet här är ett oviktat medel av de tillgängliga mätvärdena.