# Messdaten, Temperatur Durchschnitt berechnen



## nuke87 (2. Nov 2018)

Hallo, habe ein Problem. Und zwar muss ich eine Methode schreiben. 
Die Methode liest wiederholt, bis zum Eingabeende, Eingaben im folgenden Format:

1. drei Ganzzahlen, die Jahr, Monat und Tag beschreiben

2. eine Zeichenkette, die die gemessene Größe beschreibt

3. eine Gleitkommazahl, die den Messwert angibt

Und das ganze mehrmals, ist erstmal kein problem einfach mit einer While - Schleife (z.b. sc.hasNext)

Beispiel Eingabe wäre: 
2018 10 16 Luftdruck 1014.7

2018 10 17 Niederschlag 1.3

2018 10 15 Temperatur 18.2

2018 10 16 Niederschlag 0.0

2018 10 17 Temperatur 16.8


Danach muss ich alle Eingaben zu Temperatur addieren und den Durchschnitt ausrechnen und wann der heissester Tag war. Das ist auch alles klar.
Aber mein Problem ist wie ich überhaupt in den Eingaben was ich gemacht habe den Eintrag für die Temperatur herraus finde. 
Habe schon überlegt mit String vergleich, aber irgendwie klappt es nicht.
Bitte um Hilfe:


----------



## fhoffmann (2. Nov 2018)

Hast du den String-Vergleich mit == oder mit equals gemacht?


----------



## nuke87 (2. Nov 2018)

beides versucht, kriege aber Fehlermeldung, z.B bei  if (sc.hasNext().equals("Temperatur"))


----------



## fhoffmann (2. Nov 2018)

hasNext() gibt einen boolean zurück!


----------



## nuke87 (2. Nov 2018)

```
import java.util.Scanner;

public class Messdaten{
  public static void temperaturInDurchschnitt(){


Scanner sc = new Scanner(System.in);

    while (sc.hasNext()) {

    System.out.print(sc.next());

   


  }

  }
}
```

das ist erstmal für die Eingabe allgemein. Ich gebe zum Beispiel ein :
2018 10 17 Niederschlag 1.3
2018 10 15 Temperatur 18.2
2018 10 17 Temperatur 16.8


dann drücke ich STRG + d, und breche die Abfrage ab. danach muss ich aus dem was ich eingegeben hab die Temperaturangaben auswählen und mit den Werten weiter rechnen. wie wähle ich die denn überhaupt aus, wo sind die gespeichert, bin jetzt komplett durcheinander.


----------



## fhoffmann (2. Nov 2018)

Dann lies die Eingabe doch zeilenweise ein und splitte sie nach Leerzeichen

```
String zeile = sc.nextLine();
String[] werte = zeile.split(" ");
// überprüfe die Länge des Arrays
String messungstyp = werte[3];
```


----------



## mihe7 (2. Nov 2018)

Oder

```
Scanner sc = new Scanner(System.in);
        sc.useLocale(Locale.US);
        while(sc.hasNext()) {
            int jahr = sc.nextInt();
            int monat = sc.nextInt();
            int tag = sc.nextInt();
            String typ = sc.next();
            double temp = sc.nextDouble();
        }
```


----------



## nuke87 (4. Nov 2018)

Hallo nochmal, dieser Ansatz ist schon ganz gut, habe an sowas ähnliches auch gedacht.
Aber folgendes Problem, wenn ich nach der while - Schleife eine if Abfrage mache sowas wie: typ.equals("Temperatur"), wenn ja dann gib mir die temp auf den Bildschirm.  Problem dabei ist das wenn der letzte Eintrag was anderes als Temperatur war gibt der nichts raus, so wie ich denke weil im puffer schon  was anderes drin ist. Aber wie erreiche ich das alle Eingaben gespeichert bleiben für die spätere Bearbeitung?


----------



## Robat (4. Nov 2018)

nuke87 hat gesagt.:


> Aber wie erreiche ich das alle Eingaben gespeichert bleiben für die spätere Bearbeitung?


In dem du die Eingaben nicht im "Puffer" lässt sondern in eine Collection speicherst. Danach kannst du dann über die Collection deine Werte berechnen / suchen


----------



## nuke87 (4. Nov 2018)

ok super danke, aber gibt es auch andere Möglichkeiten die Eingaben zu speichern?
Wenn nicht, könntest du mir bitte ein Beispiel Code zeigen wie man es mit Collection macht, hatte noch keine Erfahrung damit.


----------



## Robat (4. Nov 2018)

Indem du die Daten in eine entsprechende Klasse (hier `Data` ) packst. Hier mal ein Minimalbeispiel.

```
class Data {
    private LocalDate date;
    private String type;
    private double value;

    public Data(LocalDate date, String type, double value) {
        this.date = date;
        this.type = type;
        this.value = value;
    }
}

List<Data> data = new ArrayList<>();
Scanner sc = new Scanner(System.in);
sc.useLocale(Locale.US);

while(sc.hasNext()) {
    int jahr = ...
    int monat = ....

    Data d = new Data(LocalDate.of(jahr, monat, tag), type, value);
    data.add(d);
}
```


----------



## MoxxiManagarm (4. Nov 2018)

Sofern du die Daten erfolgreich in einer Liste eingelesen hast kannst du den average mit Java 8 übrigens auch reicht einfach berechnen. Hier ein Beispiel:


```
List<Data> data = Arrays.asList(
            new Data("A", 4),
            new Data("B", 5),
            new Data("C", 7),
            new Data("B", 5),
            new Data("C", 11)
        );
      
        Map<String, Double> map = data.stream().collect(
                Collectors.groupingBy(
                    Data::getType,
                    Collectors.averagingDouble(Data::getValue)
                )
        );

        map.forEach((type, value) ->
                System.out.println("Average of " + type + ": " + value));
```


```
Average of A: 4.0
Average of B: 5.0
Average of C: 9.0
```


----------

