Sie sind nicht angemeldet.

  • Anmelden

Lieber Besucher, herzlich willkommen bei: MastersForum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

19.12.2010, 20:08

Java FileWriter

Hi, habe eine aufgabe in java zu lösen, und zwar möchte ich folgendes tun:
ich habe eine Hashmap, der Value ist ein Vektor (dieser hält nochmal 3 string werte). Nun möchte ich schauen, ob in einer datei (z.B. .txt) eine zeile gibt, die den selben key hat wie ein key der hashmap. Falls es diesen key in meiner datei und in der hashmap gibt, möchte ich die values aus der hashmap in der selben zeile nochmal hinten dran fügen. Falls der key aus der hashmap in der datei nicht bekannt ist, soll eine neue zeile geschrieben werden.

Ist das problem einigermaßen verständlich? :) Ich möchte einfach eine hashmap in eine datei speichern und schauen, dass in der datei kein key zwei mal vorkommt, sondern dass die values dann einfach in die selbe zeile noch hinten dran geschrieben werden.

Ich kenn mich mit dem Buffered reader und writer nicht wirklich aus, und wüsste nicht wo ich grad anfangen sollte. Vielleicht gibt es dazu eine elegante lösung? Mir fällt grad nichts ein, was auch im geringsten elegant wäre.

Zitat

So einmal im Monat mit den Tieren im Fluß waschen wenn es "dein Herr" befiehlt Ragna?

Icey

2

19.12.2010, 20:18

http://openbook.galileocomputing.de/java…faa3f8cf6ab830a

vielleicht die keys der textdatei zu erst in eine liste einlesen.

und dann mit der hashmap vergleichen und eine neue textdatei rausschreiben.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »KoH_Citrus« (19.12.2010, 20:20)


3

19.12.2010, 21:19

Zitat

Original von KoH_Citrus
http://openbook.galileocomputing.de/java…faa3f8cf6ab830a

vielleicht die keys der textdatei zu erst in eine liste einlesen.

und dann mit der hashmap vergleichen und eine neue textdatei rausschreiben.

Sowas ähnliches hab ich mir auch überlegt, aber das wird einfach ziemlich unperformant wenn die datei richtig groß ist und diese operation häufig ausgeführt wird.

4

19.12.2010, 22:32

Zitat

"Ich möchte einfach eine hashmap in eine datei speichern und schauen, dass in der datei kein key zwei mal vorkommt, sondern dass die values dann einfach in die selbe zeile noch hinten dran geschrieben werden."



So einfach das mans in 5 minuten ohne nachschlagen runterschreibt ist das leider auch wieder nicht. (Zumindest für mich nach immerhin 3 Jahren Java in der BS) Auch unsere Lehrer hätten dir das Grundgerüst nicht abgenommen sondern höchstens verbessert.

Es ist eine sehr gute Übung um den Filewriter/Filereader, Bufferedwriter/Bufferedreader zu verstehen. Dazu denke ich wird man noch Schleifen benötigen und Exceptions. Ohne Grund wirst du die Aufgabe nicht bekommen haben. ;)

Aber vielleicht hockt sich ja Worf oder so hin und programmiert es dir.

5

20.12.2010, 01:33

Ist nicht ganz simpel, ja. Ich habe die Aufgabe so verstanden:

gegeben: Map<String, Vector<String>>, Textdatei mit Strings
Wenn String aus Textdatei in Map als Schlüssel enthalten, schreibe an der entsprechenden Stelle in der Datei die Werte hinter den Schlüssel (Trennzeichen?!).
Füge die verbleibenden Schlüssel mitsamt ihren Werten hinten in der Datei an.

Gut, ich würde eine separate Ausgabedatei nehmen, man weiß nie was so schiefläuft. Hier der Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Vector<String> strings; // die drei Werte
StringBuffer newFileContent = new StringBuffer(); // Inhalt der Ausgabedatei
File txtFile = new File("blablubb.txt"); // Eingabedatei
BufferedReader br = new BufferedReader(new FileReader(txtFile));
String line = br.readLine(); // erste Zeile lesen
while (line != null) // Datei noch nicht zu Ende
{
  newFileContent.add(line);

  if (map.get(line) != null) // Schlüssel aus Datei auch in Map => Werte hinzufügen
  {
    strings = map.get(line);
    newFileContent.add(";" + strings.get(0) + ";" + strings.get(1) + ";" + strings.get(2));
    map.remove(line); // Schlüssel war schon eingetragen => muss nicht mehr hinten angefügt werden
  }

  newFileContent.add("\n"); // Zeilenumbruch
  line = br.readLine(); // nächste Zeile
}
Set<String> keys = map.keySet(); // verbleibende Schlüssel
Iterator<String> it = keys.iterator();
String key; // aktueller Schlüssel
while (it.hasNext()) // noch Schlüssel übrig
{
  key = it.next();
  strings = map.get(key);
  newFileContent.add(key + ";" + strings.get(0) + ";" + strings.get(1) + ";" + strings.get(2) + "\n");
}
FileWriter fw = new FileWriter(new File("outputFile.txt"));
fw.write(newFileContent.toString());
fw.flush(); // sofort schreiben (brauchen wir hier nicht unbedingt, sollte man sich aber angewöhnen)
fw.close(); // Datei freigeben (brauchen wir auch nicht, aber auch zum Angewöhnen)


Die try und catch Blöcke fehlen jeweils, aber da meckert Eclipse schon. Ich gehe davon aus, dass in der Eingabedatei wirklich nur die Schlüssel stehen. Keine Leerzeichen, keine Semikolons, keine bereits eingetragenen Werte. Wenn ein Schlüssel gefunden wird, der in der Map nicht vorhanden ist, wird einfach nur der Schlüssel wieder in die neue Datei eingefügt. Die Ausgabedatei hat als kleinen Schönheitsfehler eine leere Zeile am Schluss.

Habe den Code im wesentlichen von meinen Projekten übernommen - kein Gewähr auf syntaktische Richtigkeit, aber so in etwa sollte es passen.

6

21.12.2010, 09:08

Vielen Dank Sheep! Das gibt mir einen guten Einblick in die Lösung ! :)
Ich hoffe wirklich, das war nicht zu viel Aufwand. Damit jetzt nicht noch mehr sich die Mühe machen, sag ich an der Stelle mal Stopp. Ob ich das ganze nun so lösen möchte, weiß ich noch nicht 100%ig. Das eleganteste wäre vielleicht sogar eine einfache MySQL Datenbank hintendran, aber das wird ziemlich wahrscheinlich nicht erlaubt sein.

7

21.12.2010, 18:11

Kein Problem. War auch nur eine gute halbe Stunde, hatte ja das meiste schon herumliegen. :)

8

22.12.2010, 14:35

Anstatt einer SQL Datenbank schau dir doch auch mal JDBM an:
http://jdbm.sourceforge.net/