[Java]LinkedList Minmium und Maximum bestimmen

infifi

Cadet 1st Year
Registriert
Juni 2013
Beiträge
8
Ich brauche Hilfe beim bestimmen vom Maximum und Minimum wert aus einer CSV-Datei.

Den Durchschnitt geht zu berechnen, nur Minimum und Maximum geht nicht.
Hab nichts gefunden, was sich auf das einlesen einer Datei konzentriert.


Wäre schön, wenn jmd. mir helfen könnte.

Code:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Collections;
import java.util.LinkedList;
 
public class DatenHalter {
	static int welchezeile = 0;
    public static void main(String[] args) {
        BufferedReader reader = null;			
        try {
            reader = new BufferedReader(new FileReader(new File("C:/Action!/Benchmarks/ACBSP 19-01-2014 13-58-02.csv")));
        } catch(FileNotFoundException e) {      	
            e.printStackTrace();
            System.err.println("Fehler beim Öffnen der Datei!");
            return;
        }
        LinkedList<String> rows = new LinkedList<String>();
        try {
            for(String tmp = null; (tmp = reader.readLine()) != null;) {
                rows.add(tmp);
                welchezeile++;
            }
        } catch(IOException e) {
            e.printStackTrace();
            close(reader);
            return;
        }
 
        close(reader);
        double sum = 0;
        for(String row : rows) {
            double number = 0;
            try {
            	number = Double.valueOf(row.replaceAll(",","."));
            } catch(NumberFormatException e) {
                e.printStackTrace();
                System.err.println("Fehler: Eine Zeile hat ein fehlerhaftes Format!");
                continue;
            }
            sum += number;  
        }
        sum /= welchezeile;
        sum = Math.round(sum*1000)/1000.0;
        System.out.println("Alle Zeilen:");
        for(String row : rows) {
            System.out.println(row);
        }
		System.out.println("\nDer Durchschnitt beträgt: " + sum);
        System.out.println("Insgesamt sind es: " + welchezeile + " Zeilen");
    }
 

    private static void close(Reader r) {
        try {
            r.close();
        } catch(IOException e) {
            e.printStackTrace();
            System.err.println("Fehler beim Schließen des Readers!");
        }
    }
}
 
Es gibt mehrere Wege, das Problem anzugehen.

Der erste und vermutlich einfachste Weg ist es, an der Stelle, wo du die Gesamtsumme zusammenrechnest, gleich mal nach dem größten und kleinsten Wert Ausschau zu halten. Hast du einen kleineren/größeren Wert gefunden als bisher bekannt, dann merkst du dir das. Fertig. ;)

Der zweiten Weg ist etwas komplizierter und eigentlich nur in wenigen Fällen nützlich. Du könntest einen Comparator für die Liste bauen (nur, falls dir nach Alphabet sortierte Strings nicht ausreicht), mit dem du die Liste mittels Collections.Sort() nach Größe sortieren lässt. Der Minimum- und der Maximumwert befinden sich dann an der ersten und letzten Stelle der Liste. Je nach Listengröße ist das allerdings keine gute Idee, da das Sortieren (insbesondere bei Strings) vieler Elemente lange dauern kann. Kann man später aber eine sortierte Liste gut gebrauchen, ist die Idee nicht verkehrt.
 
Code:
min = max = list.first
for(...){
     if(current < min){
          min = current;
     }
     ...
}

Übrigens könnte man da durchaus 1-2 for-Schleifen einsparen.

Viele Grüße,
-quick-
 

Ähnliche Themen

Antworten
21
Aufrufe
9.237
1668mib
1
Zurück
Oben