Immer nur drei Werte lesen

flashdog

Bekanntes Mitglied
Hallo,
folgender Code liest die unteren Zeilen ein und speichert diese in ein ArrayList ab. Anschließend berechnet er aus allen Werten den Medien Wert aus und gibt in aus.
Code:
4 
5 
1 
3 
1 
7 
2 
6 
2 
7 
1

Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

public class Numbers {
  private ArrayList<Double> ret = new ArrayList<Double>();

  public Numbers(String filename) throws IOException {
    readNumbers(filename);
  }

  public void readNumbers(String fn) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(fn));

    String line;
    while ((line = br.readLine()) != null) {
      ret.add(Double.parseDouble(line.trim()));
    }
  }

  public double median() {
    Collections.sort(ret);

    if (ret.size() % 2 == 1) {
      return ret.get((ret.size() + 1) / 2 - 1);
    } else {
      double lower = ret.get(ret.size() / 2 - 1);
      double upper = ret.get(ret.size() / 2);

      return (lower + upper) / 2.0;
    }
  }

  public static void main(String[] args) {
    String fileName = "F:\\testFile.txt";

    try {
      Numbers n = new Numbers(fileName);
      System.out.println("Read file " + fileName);
      double median = n.median();
      System.out.println("Median value is " + median);
    } catch (IOException ie) {
      System.err.println("I/O Error: " + ie);
    }
  }
}

Wie könnte man den Code am besten modifizieren damit dieser jeweils aus drei Werten den Medien berechnet und wenn es keine drei Werte existieren dann eben aus dem Rest?

Viele Grüße
 

DaveX

Mitglied
Ich verstehe nicht so ganz um welche 3 Werte es sich handelt?

Möglichkeit 1:

median of (wert1,wert2 ,wert3)
median of (wert4,wert5 ,wert6)
median of (wert7,wert8 ,wert9)
...

Möglichkeit 2:
median of (wert1,wert2 ,wert3)
median of (wert2,wert3 ,wert4)
median of (wert3,wert4 ,wert5)
...

oder willst du noch was anderes ?
wie viele ergebnise soll es geben ?
 

flashdog

Bekanntes Mitglied
Drei Werte war nur ein Beispiel um schnell das Programm zu testen. In Wirklichkeit kann die Eingabedatei mehr als 10000 Einträge oder weniger beinhalten und ich möchte jeweils aus 1000 Einträgen den Median bestimmen d.h. ich würde 10 Median (10 X 1000) Werte bekommen.

Die Datei kann also nicht Grade sein z.B. 9999 und dann muss ich noch immer 10 Werte als Ergebnis bekommen (9 X 1000 und 1 X 999).
 

DaveX

Mitglied
Ich versuche mal hier was in Pseudocode zu skizzieren:
Annahme ALL = 9999 Werte und MEDIAN = 10 (sprich 10 Medians)


zum Klären - Dein Problem besteht darin die ganze Liste in geeignete partitions zu teilen
d.h. 9999 / 10 = 999 und nicht 1000 wie du es haben willst

nun die schnell lösung wie man die partitionsgröße errechnen kann:
Java:
Integer allValues = 9999; // Integer wichtig für die toString() Operation
int Median = 5;
Double tmp = Double.valueOf(allValues );

for(int pos = 0 ; pos < allValues .toString().length()-1;pos++)
    tmp = tmp /10;
		
int fullsize = (int)(Math.ceil(tmp) * Math.pow(10,alleWerte.toString().length()-1) );
// nun hast du 10000 als Ergebnis
int partitionsize = fullsize / Median; // nun hast du deine 1000 schrittweite

1. Datei einlesen und jede Zahl in eine List speichern
2. in einer for schleife:
Java:
for ( int pos = 0; pos < list.size(); pos += partitionsize ) 
// somit hast du die nach jedem schleifen durchlauf 
// jeweils eine partition übersprungen.
{
    // hier den Median der Partition berechnen
    for( int partpos = 0 ; partpos < partitionsize && pos + partpos <  list.size() ; partpos++) 
    {
        // hier die werte der partition aufsammeln vllt. in eine neue List
    }
    //hier hast du eine List mit entweder mit 1000 oder den rest Elementen
   // die kannst du dann deiner funktion übergeben , muss sie aber modifizieren -
// sprich nicht auf member variable zugreifen sondern auf das was du übergeben hast
// (die Liste aus der inneren for schleife) und entsprechend dein ergebnis in eine ergebnis list speichern.

So falls du weiter nciht weisst, dann schreib mal was du nicht verstehst.
Ich hoffe ich könnte zumindest auf die Sprunge helfen.
 
Zuletzt bearbeitet:

flashdog

Bekanntes Mitglied
Leider habe ich deine Lösung nicht ganz verstanden und habe es nochmal versucht und es scheint zu funktionieren siehe (readNumbers()).

Gibt es eine Möglichkeit den Code zu optimieren z.B.
1.)
BufferedReader br = new BufferedReader(new FileReader(fn));
BufferedReader br = new BufferedReader(new FileInputStream(fn);
Oder gibt es eine andere schnellere Kombination und gibt es irgendwo Benchmarks?

2.)
Ist die Berechnung von Median optimal?

Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

public class Numbers {

  private ArrayList<Double> medians = new ArrayList<Double>();

  public Numbers(String filename, int lines) throws IOException {
    readNumbers(filename, lines);
  }

  private void readNumbers(String fn, int lines) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(fn));
    ArrayList<Double> numbersFromFile = new ArrayList<Double>();
    int i = 0;
    String line;
    
    while (true) {
      i++;
      if ((line = br.readLine()) != null) {
        numbersFromFile.add(Double.parseDouble(line.trim()));
        if (i == lines) {
          i = 0;
          median(numbersFromFile);
          numbersFromFile.clear();
        }
      } else {
        median(numbersFromFile);
        numbersFromFile.clear();
        break;
      }
    }
  }

  public void median(ArrayList<Double> values) {
    Collections.sort(values);

    if (values.size() % 2 == 1) {
      medians.add(values.get((values.size() + 1) / 2 - 1));
    } else {
      double lower = values.get(values.size() / 2 - 1);
      double upper = values.get(values.size() / 2);
      medians.add((lower + upper) / 2.0);
    }
  }

  public void output() {
    for (double v : medians) {
      System.out.println(v);
    }
  }

  public static void main(String[] args) {
    String fileName = "F:\\testFile.txt";

    try {
      Numbers n = new Numbers(fileName, 3);
      System.out.println("Read file " + fileName);
      n.output();
    } catch (IOException ie) {
      System.err.println("I/O Error: " + ie);
    }
  }
}
 

nrg

Top Contributor
Gibt es eine Möglichkeit den Code zu optimieren z.B.

ja, du könntest z.b. den konstruktor dafür hernehmen, wofür er da ist und zwar zum initialisieren der attribute. das was du machst ist imho aus oo-sicht ein grauss. ist jetzt allerdings kein funktionelles problem - eher ein stilistisches.

ansonsten vllt in readNumbers die numberformatexception catchen.

...

ok.. nachdem mir grad beim schreiben immer mehr sachen auffallen, die in meinen augen nicht so optimal sind, hab ich das jetzt mal kurz in eine anständige form gebracht.

ich sag aber gleich, dass ich weder mich tiefer mit dem algo beschäftigt habe, noch zu der uhrzeit für korrektheit garantiere :D

Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

public class Numbers {

	private ArrayList<Double> medians;
	private ArrayList<Double> numbersFromFile;
	private String filename;
	private int lines;

	public Numbers(String filename, int lines) {
		medians = new ArrayList<Double>();
		numbersFromFile = new ArrayList<Double>();
		this.filename = filename;
		this.lines = lines;
	}
	public void setFilename(String filename) {
		this.filename = filename;
	}
	public String getFilename() {
		return filename;
	}
	public void setLines(int lines) {
		this.lines = lines;
	}
	public int getLines() {
		return lines;
	}
	private void readNumbers() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(filename));
		int i = 0;
		String line;
		try {
			while ((line = br.readLine()) != null) {
				numbersFromFile.add(Double.parseDouble(line.trim()));
				if (++i == lines) {
					i = 0;
					median();
				}
			} 
			median();
		} catch (NumberFormatException nfe) {
			System.out.println("Fehlerhafte Entität in der Eingabedatei! Java Fehler: " + nfe.getMessage());
		} finally {
			br.close();
		}
	}
	private void median() {
		Collections.sort(numbersFromFile);
		if (numbersFromFile.size() % 2 == 1) {
			medians.add(numbersFromFile.get((numbersFromFile.size() + 1) / 2 - 1));
		} else {
			double lower = numbersFromFile.get(numbersFromFile.size() / 2 - 1);
			double upper = numbersFromFile.get(numbersFromFile.size() / 2);
			medians.add((lower + upper) / 2.0);
		}
		numbersFromFile.clear();
	}
	public void output() {
		for (double v : medians)
			System.out.println(v);
	}
	public static void main(String[] args) {
		try {
			Numbers n = new Numbers("F:\\testFile.txt", 3);
			n.readNumbers();
			System.out.println("Read file " + n.getFilename());
			n.output();
		} catch (IOException ie) {
			System.err.println("I/O Error: " + ie);
		}
	}
}

edit die 5te... ich geh jetzt einfach schlafen, dann fallen mir auch keine sachen mehr ein, die ich editieren kann ^^
 
Zuletzt bearbeitet:

DaveX

Mitglied
Hi, ich sehe dass, bei deinem Ansatz, du selbst bestimmst wie viele Zahlen den Median bilden.
Dh. wenn insgesamt 10 Medians haben willst musst du nun im Kopf rechenen wie viele Zeilen es sind,
und ggf selbst aufrunden.

Bei meinem Anstatz, bestimmst du wie viele Medians du haben willst.

BEISPIEL:
es gibt 467 Zahlen (Lines in der Datei) und du insgesamt 5 Medians willst.
467 / 5 = 93,4 -> das sollten die Lines pro Medians sein - nicht optimal

so runde ich in der Schleife nacheinander 467 nach 47,0 dann 47,0 nach 5,0 und dann
multipliziere ich dies mit der potenz von 10 hoch die Länge der ersten (Zahl -1)
5,0 *(10 ^ (3 -1))
so bekomme ich 500. Nun teile ich dies durch die Anzahl der Medians 5 und weiss dass ich 100 zeilen pro median abarbeiten muss.

Ich weiss natürlich nicht ob du solches vorgehen vorhattest.
 

flashdog

Bekanntes Mitglied
Danke für die Korrektur.

Ich brauchte nur eingeben wie viele Zahlen ein Median bilden.

Welche von diesen Kombinationen ist die schnellste?
BufferedReader br = new BufferedReader(new FileReader(fn));
BufferedReader br = new BufferedReader(new FileInputStream(fn);

Gibt es irgendwo eine Seite wo man für jedes Problem die schnellste Buffered/Stream Kombination finden kann?
 

nrg

Top Contributor
mal ganz allgemein, wenn du dir öfters die Frage stellen solltest, ob a oder b schneller ist:

Java:
		long start = System.nanoTime();
		//a
		System.out.printf("a braucht %g ms\n", (double)(System.nanoTime() - start) / 1000000);
		start = System.nanoTime();
		//b
		System.out.printf("b braucht %g ms\n", (double)(System.nanoTime() - start) / 1000000);

einfach ausprobieren :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Immer dieselbe Zufallszahl Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
F Warum muss ich ein SSL cert immer manuell hinzufügen? Java Basics - Anfänger-Themen 46
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
K Warum werden immer noch doppelte Zahlen ausgegeben ? Java Basics - Anfänger-Themen 13
J Componente immer in Front halten, wie? Java Basics - Anfänger-Themen 5
berserkerdq2 Brauche ich while != -1, wenn ich immer einen BufferedReader verwende? Java Basics - Anfänger-Themen 8
berserkerdq2 Habe ein Spiel entwickelt, dass immer in der 4 Runde einen cast-Fehler erhält Java Basics - Anfänger-Themen 3
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
chocobear26 Interface JOptionPane - Dialog_Fenster zeigt immer vorherige Eingabe an. Java Basics - Anfänger-Themen 4
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
I Array übernimmt immer den letzten Input. Java Basics - Anfänger-Themen 14
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
M Untersuchen ob ein Graph nach entfernen einer Kante immer noch zusammenhängend ist Java Basics - Anfänger-Themen 70
J Zweck von Interfaces immer noch nicht klar Java Basics - Anfänger-Themen 3
M Array immer wieder um ein Element erweitern Java Basics - Anfänger-Themen 6
CptK Methoden Event bei gedrückter Maustaste immer wieder ausführen Java Basics - Anfänger-Themen 1
CptK Klassen Event bei gedrückter Maus immer wieder mit Pause ausführen Java Basics - Anfänger-Themen 2
IMain23 2d Array variabler Spaltenwert, Spaltenwert immer um eins erhöhen Java Basics - Anfänger-Themen 3
M JTextField blitzt immer wieder nur auf Java Basics - Anfänger-Themen 12
N Arbeitsspeicher nach kompilieren immer voller Java Basics - Anfänger-Themen 6
S Immer das selbe mit den Schleifen Java Basics - Anfänger-Themen 24
H OOP eine Zahl immer weiter durch 2 teilen Java Basics - Anfänger-Themen 15
B Operatoren Java berechnet immer 0? Java Basics - Anfänger-Themen 3
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
N Funktion funktioniert nicht immer Java Basics - Anfänger-Themen 6
I Methoden Schleife immer wieder durchlaufen lassen Java Basics - Anfänger-Themen 15
3 JFrame immer im Hintergrund Java Basics - Anfänger-Themen 1
F Immer wieder gleiche Zufallszahl? Java Basics - Anfänger-Themen 4
J Operatoren Random wird nur einmal erstellt und dann immer verwendet Java Basics - Anfänger-Themen 2
S Repaint() in der Schleife funktioniert nicht immer Java Basics - Anfänger-Themen 5
S Variable in JTextField soll immer um 5 zunehmen Java Basics - Anfänger-Themen 8
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
N JList + DefaultListModel + JScrollPane --> ensureIndexIsVisible funktioniert nicht immer Java Basics - Anfänger-Themen 1
N Immer Aktiv sein. Java Basics - Anfänger-Themen 8
D Array wird immer mir 100 für jeden Wert initialisiert? Java Basics - Anfänger-Themen 2
J Ergebnis immer 0 Java Basics - Anfänger-Themen 8
S If-Anweisunng ist IMMER true Java Basics - Anfänger-Themen 2
F Inhalt einer Variable auswerten, die sich immer wieder ändert Java Basics - Anfänger-Themen 1
S UserPref und Java Application klappt immer nicht. Java Basics - Anfänger-Themen 2
Ponychan95 Erste Schritte Switch fällt immer bis zum default durch Java Basics - Anfänger-Themen 4
F String immer weiter nach Bedarf vergrößern Java Basics - Anfänger-Themen 3
X Muss man das immer so schreiben o.O Java Basics - Anfänger-Themen 3
F Timer beendet nicht immer Java Basics - Anfänger-Themen 2
N Boolean Werte - immer "false" Java Basics - Anfänger-Themen 5
P JavaFX Textfelder geben immer null zurück Java Basics - Anfänger-Themen 8
M zufälliges Setzen von Schiffen in while klappt nicht immer Java Basics - Anfänger-Themen 3
S Random IDs immer 10-stellig? Wie? Java Basics - Anfänger-Themen 5
B Klassen Objekte werden immer überschrieben Java Basics - Anfänger-Themen 10
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
C JavaMail funktioniert nicht immer Java Basics - Anfänger-Themen 8
J .txt Datei "einlesen "und in String speichern ergibt immer NULL Java Basics - Anfänger-Themen 17
M Noch immer Probleme mit exec Java Basics - Anfänger-Themen 15
A Java Arrays immer um eins "vergrößern" Java Basics - Anfänger-Themen 4
E Input/Output Drucken am Mac immer gleiche Schriftgröße?!? Java Basics - Anfänger-Themen 2
R Hashset.add(Array) liefert immer true? Java Basics - Anfänger-Themen 23
I immer die gleiche Zufallszahl Java Basics - Anfänger-Themen 9
F Funktion immer zur vollen Stunde? Java Basics - Anfänger-Themen 3
A Warum immer das "J" im Klassennamen? Java Basics - Anfänger-Themen 10
M Erste Schritte Eclipse führt immer das gleiche Programm aus Java Basics - Anfänger-Themen 6
B Schlüsselworte this - immer oder nur wenn wirklich notwendig? Java Basics - Anfänger-Themen 9
A Wieso wird immer 0 ausgegeben? Java Basics - Anfänger-Themen 4
C 2 Objekte, 1 immer Null? Java Basics - Anfänger-Themen 8
P Classpath falscher Classpath, aber nicht immer Java Basics - Anfänger-Themen 19
E JButtons auf JFrame nicht immer sichtbar Java Basics - Anfänger-Themen 4
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
P toString-Methode gibt immer null vor Variable aus Java Basics - Anfänger-Themen 9
L Immer diese Arrays Java Basics - Anfänger-Themen 11
M OOP Graphics immer selbstbezihend Java Basics - Anfänger-Themen 12
D . ist nicht immer .!? Java Basics - Anfänger-Themen 18
S Dezimale Konstanten sind immer positiv oder null - was heisst das den genau? Java Basics - Anfänger-Themen 2
L JTextField getText() gibt immer null zurück Java Basics - Anfänger-Themen 10
J \n funktioniert nicht immer Java Basics - Anfänger-Themen 10
L Woerterbuch liefert immer "null" Java Basics - Anfänger-Themen 41
J Datentypen Math.sqrt() immer NaN Java Basics - Anfänger-Themen 8
T Datei so speichern das sie immer erreichbar ist Java Basics - Anfänger-Themen 2
Os-Programming Checkbox immer wieder überprüfen Java Basics - Anfänger-Themen 13
ruutaiokwu final wenn immer möglich verwenden? Java Basics - Anfänger-Themen 30
E Input/Output Datei immer weiter erweitern Java Basics - Anfänger-Themen 4
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
B if erzeugt nur immer ein FALSE Java Basics - Anfänger-Themen 2
M Tabelle mit immer sortiertem Inhalt Java Basics - Anfänger-Themen 5
F Midi-Sequenzer gibt immer denselben, schrägen Ton aus? Java Basics - Anfänger-Themen 2
M isHidden() von java.io.File liefert immer true in Windows Java Basics - Anfänger-Themen 3
A Immer wird "gut" ausgegeben Java Basics - Anfänger-Themen 14
G Immer mehr Threads beim Selbstaufruf der main-Methode Java Basics - Anfänger-Themen 3
N immer Setter-Methoden verwenden? Java Basics - Anfänger-Themen 54
M immer noch usedelimiter Java Basics - Anfänger-Themen 4
R ARRAY/List die sich immer wieder von vorne neu auffüllt ? Java Basics - Anfänger-Themen 21
Y JFrame immer im Focus ? Java Basics - Anfänger-Themen 7
N ArrayList wird immer um zwei Elemente erweitert Java Basics - Anfänger-Themen 9
J cast zu int immer 0.. Java Basics - Anfänger-Themen 6
B Process.getInputStream immer leer Java Basics - Anfänger-Themen 3
T ArrayList immer die letzte Zeile Java Basics - Anfänger-Themen 2
C Array ist befüllt, doch gibt sie immer 0 zurück Java Basics - Anfänger-Themen 3
B Warum kommt immer die 0 als Ergebnis? Was habe ich falsch gemacht? Java Basics - Anfänger-Themen 18

Ähnliche Java Themen

Neue Themen


Oben