Ermitteln des kleinsten Messwertes von jedem Tag

Domo-Kun

Mitglied
Hallo!!!

Ich habe folgendes Problem und hoffe ihr könnt mir weiter helfen!!
Als Eingabe habe ich Datum, Uhrzeit und jeweils einen dazugehörigen Messwert (22.06.10 21:46:01,WERT) und möchte nun von jedem Datum den kleinsten Wert, der Größer ist als ein Schwellenwert ermitteln. Ausgabe soll also: 22.06.10, NIEDRIGSTERWERT sein. Ich weiß leider nicht so wirklich, wie ich an die Sache ran gehen soll vielleicht habt ihr eine kleine Anregung für mich (z.B. welche Datenstruktur ihr verwenden würdet).

Danke!

Domo-Kun
 
Hast du als Eingabe eine Datei mit allen Messwerten?
Passt die in den Speicher?
Falls ja könntest du dir ein Hash aufbauen mit dem Datum als Schlüssel und einer Menge von Werten als Wert.
 
Anregung:
zB HashMap<Datum, Vector<int>>

dann kannst du mit Key-Datum das kleinste Element aus dem Int-Vector bestimmen und ausgeben lassen.
Statt Vector vielleicht eine Klasse, die SortedSet implementiert nehmen, dann sollte auch die Ausgabe recht schnell vonstatten gehen.
 
Geht doch auch so:

Java:
int kleinsterWert = Integer.MAX_VALUE;
while (nochNichtMitternacht(()) {
    if ((aktuellerMesswert < kleinsterWert) && (aktuellerWert > schwellwert))
        kleinsterWert = aktuellerMesswert;
}
Datum und kleinster Wert ausgeben

Wozu brauchst du eine Datenstruktur?

Aber vermutlich verstehe ich irgendetwas falsch.
 
Die Messwerte kommen ja zeitlich in korrekter Reihenfolge an (muss ja so sein 🙂 ) da taugt jede Liste bzw sogar ein File als Speicher.

Durchiterieren und suchen - na ja, mal abwarten vielleicht kommt ja ein Hinweis.
 
Vielen Dank schonmal für die vielen Anregungen!!

Ich habe jetzt einfach mit dem Hinweis von "henpara" angefangen und eine HashMap erstellt. Die Daten werden Zeile für Zeile aus einer Text-Datei eingelesen und jeweils dem Datum alle Messwerte zugewiesen. Über meinehashmap.get("20.04.2011") würde ich dann z.B alle Messwerte von diesem Tag bekommen (ich habe das Datum einfach als String belassen). Jetzt weiß ich allerdings nicht, wie ich aus dieser Situation heraus an die Min-Werte kommen soll, die über dem Wert 25 liegen...^^Nochmal zur genaueren Erklärung, welche Ein- und Ausgaben ich habe bzw. haben möchte:

Eingabe: txt-file mit Zeilen der Form:
22.06.10 21:46:01,WERT
22.06.10 22:15:05,WERT2 ...

Ausgabe: txt-file mit Zeilen der Form
22.06.10 Wert (wobei dieser Wert der minimale aller Werte an diesem Tag über 25 ist)
 
Über meinehashmap.get("20.04.2011") würde ich dann z.B alle Messwerte von diesem Tag bekommen (ich habe das Datum einfach als String belassen).

Ich geb dir jetzt mal "pseudocode":

Java:
public int getMinVal(HashSet<int> hs, int schranke, int lastEntry) {
 int minVal = schranke;
 int kleinsterWert = lastEntry;
 for (iterator i = hs.iterator(); i.hasnext();) {
  int tmp = i.next();
  
  if (tmp < minVal && kleinsterWert == null) {
  
  } else if ( tmp>= minVal && kleinsterWert != null && tmp < kleinsterWert){
   kleinsterWert = tmp;
  }
 }
 return kleinsterWert;
}
 
Zuletzt bearbeitet:
Du machst einen Überlegungsfehler: ein HashMap ist KEINE Datenbank.

In einer HashMap gibt es genau einen eintrag pro Key - wenn du also das Datum als key verwendest, wirst du eine böse Überraschung erleben.

EDIT: Ich habe gesehen, dass du die Zeit auch verwendest, also geht das doch gut, ausser wenn Zwei Messwerte denselben Zeitstempel haben.

Aber warum willst du das überhaupt erst in einer komplizierten Datenstruktur ablegen? Das bringt dir rein gar nichts.

Wie ist denn deine Textdatei aufgebaut? Da sind die Werte ja wohl sicher schön der Reihe nach drin - wie sollen die sonst da reingekommen sein???:L

Gehe Deine Datei durch (Meine Glaskugel hat mir erzählt es gäbe da Zeilenweise Einträge mit Datum und Wert) auslesen und dann, wie in meinem Loop oben gezeigt Wert(e?) merken.
 
Deshalb schlug ich einen Hash mit dem Datum als Schlüssel und einer Liste oder etwas geeignetem, um dazu alle Messwerte zu sammeln, als Werte vor.
 
Du machst einen Überlegungsfehler: ein HashMap ist KEINE Datenbank.

In einer HashMap gibt es genau einen eintrag pro Key - wenn du also das Datum als key verwendest, wirst du eine böse Überraschung erleben.

Dann habe ich wohl tatsächlich einen Denkfehler gehabt, ich bin nämlich davon ausgegangen, dass zu jedem Key eine Liste der Werte gespeichert wird...dann werf ich also alles wieder über den Haufen ;( ...

Ja... ich habe zeilenweise Einträge mit Datum und Wert.

Dann probier ich jetzt mal weiter...danke schonmal!!
 
Geht doch auch so:

Java:
int kleinsterWert = Integer.MAX_VALUE;
while (nochNichtMitternacht(()) {
    if ((aktuellerMesswert < kleinsterWert) && (aktuellerWert > schwellwert))
        kleinsterWert = aktuellerMesswert;
}
Datum und kleinster Wert ausgeben

Das sieht nach einer sehr einfachen und sinnvollen Sache aus, aber ich habe keine Ahnung, wie ich das dann auf jedes Datum anwenden soll...Was ich auch nicht erwähnt habe (weil ich dachte das wär' mein geringstes Problem) ist, dass jeweils der erste und der letzte Messwert, der über dem Schwellenwert liegt, verfälscht sein kann und deshalb gelöscht werden soll.

Zur Veranschaulichung: Man kann sich das so vorstellen, dass wir am Anfang eine konstante Raumtemperatur haben, dann werfen wir ein Thermometer irgendwann in heißes Wasser und nehmen es nach 6 Stunden wieder raus (Messungen erfolgen alle 15 Minuten). Dann verfälschen jeweils der erste und der letzte Wert die Messung.

Ist es insgesamt dann nicht vielleicht doch sinnvoll einen Hash und eine Liste bzw. ein Array zu nehmen?Denn wenn ich alle Werte nur dann abspeichere, wenn sie den Schwellenwert überschreiten, dann müsste ich ja einfach nur das erste und das letzte Element löschen (denn die Werte befinden sich dann ja in der Reihenfolge, wie sie eingelesen wurden).....
 
Dann habe ich wohl tatsächlich einen Denkfehler gehabt, ich bin nämlich davon ausgegangen, dass zu jedem Key eine Liste der Werte gespeichert wird...dann werf ich also alles wieder über den Haufen ;( ...

Ja... ich habe zeilenweise Einträge mit Datum und Wert.

Dann probier ich jetzt mal weiter...danke schonmal!!

Dann ist es schon beinahe banal - einfach Zeile für Zeile durch das File durchlaufen
Jede Zeile in Datum Zeit und Wert aufteilen (Zeit wegschmeissen)
und dann beim entsprechenden Datum prüfen ob der Wert gespeichert werden muss oder nicht.

Braucht schätzungsweise 20 Zeilen Code wenn nicht noch weniger 🙂
 
Vielleicht kam nicht deutlich zum Ausdruck, was ich meinte. Aber ein Hash kann sehr wohl auch mehrere Werte zu einem Schlüssel ablegen, man muss es ihm nur sagen.


Java:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ComplexHash {

    public static void main(String[] args) {
        Map<String, List<String>> hash = new HashMap<String, List<String>>();

        String key1 = "P3421";
        List<String> value1 = new ArrayList<String>();
        value1.add("eins");
        value1.add("zwei");
        value1.add("drei");

        String key2 = "BG221";
        List<String> value2 = new ArrayList<String>();
        value2.add("vier");

        String key3 = "hG1";
        List<String> value3 = new ArrayList<String>();
        value3.add("fuenf");
        value3.add("sechs");


        hash.put(key1, value1);
        hash.put(key2, value2);
        hash.put(key3, value3);

        System.out.println(hash);
    }

}

Ausgabe:

Code:
{hG1=[fuenf, sechs], P3421=[eins, zwei, drei], BG221=[vier]}
 

Zurück
Oben