Messdaten, Temperatur Durchschnitt berechnen

nuke87

Mitglied
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:
 

nuke87

Mitglied
Code:
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

Top Contributor
Dann lies die Eingabe doch zeilenweise ein und splitte sie nach Leerzeichen
Java:
String zeile = sc.nextLine();
String[] werte = zeile.split(" ");
// überprüfe die Länge des Arrays
String messungstyp = werte[3];
 

mihe7

Top Contributor
Oder
Java:
        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

Mitglied
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?
 

nuke87

Mitglied
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

Top Contributor
Indem du die Daten in eine entsprechende Klasse (hier Data ) packst. Hier mal ein Minimalbeispiel.
Java:
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

Top Contributor
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:

Java:
        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));

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

Neue Themen


Oben