Seltsame Ausgabe beim zusammenführen zweier Dateien

Status
Nicht offen für weitere Antworten.

Der Programmierer

Aktives Mitglied
Hi,

ich hab mir vor kurzem einen Dialog geschrieben, welcher 2 .txt Dateien ausließt und den inhalt der beiden dateien in die zweite mit reinschreibt und eigentlich die doppelten Zeilen löschen soll.

So ich hab auch 2 Dateien

datei1.txt enthält:

a
a
b
c
d
e
f
f
g
h
i

datei2.txt enthält

i
j
k
l
l

Das erwartete Ergebnis in datei1 wäre:

a
b
c
d
e
f
g
h
i
j
k
l

Es ist allerdings:

i
a


Der Code sieht wie folgt aus:

Code:
class zusammenfuehren extends JDialog implements Runnable
{
	HashSet<String> liste = new HashSet<String>();	
	LineNumberReader lnr;
	LineNumberReader line;
	int zeilen;
	int zeil;
	BufferedReader getZeilen;
	BufferedReader zaehler;
	String dateiname;
	String name;
	JProgressBar bar;
	double fortschritt;
	String it;
	String zwischen;


	zusammenfuehren(String titel, JFrame f)
	{
		super(f,titel,true);

		FileDialog d = new FileDialog(this, "Datei 1 auswählen", FileDialog.LOAD);
		d.setVisible(true);

		dateiname = d.getDirectory()+d.getFile();

		FileDialog s= new FileDialog(this, "Datei 1 auswählen", FileDialog.LOAD);
		s.setVisible(true);
		
		name = s.getDirectory()+s.getFile();

		try
		{
			zaehler = new BufferedReader(new FileReader(dateiname));

			while(zaehler.readLine() != null);
			{
				zeilen++;
			}

			getZeilen = new BufferedReader(new FileReader(name));

			while(getZeilen.readLine() != null);
			{
				zeil++;
			}
		}

		catch(Exception e)
		{
			e.printStackTrace(); 	
		}
	
			
		


		bar = new JProgressBar(0, zeilen+zeil);

		setResizable(false);
		setLayout(new FlowLayout());
		add(bar);
		pack();

	}

	public void run()
	{
		try
		{
			lnr = new LineNumberReader(new FileReader(dateiname));
			line = new LineNumberReader(new FileReader(name));

			for(int i = 0; i<zeilen; i++)
			{
				zwischen=lnr.readLine();
				liste.add(zwischen);
				fortschritt = fortschritt+0.4;	
				bar.setValue((int)fortschritt);
			}

			for(int i=0; i<zeil; i++)
			{
				zwischen=line.readLine();
				liste.add(zwischen);
				fortschritt = fortschritt+0.4;	
				bar.setValue((int)fortschritt);
			}


			BufferedWriter buffy = new BufferedWriter(new FileWriter(dateiname));
			Iterator <String> tmp = liste.iterator();

			for(int i = 0; tmp.hasNext(); i++)
			{
				it = tmp.next();
				buffy.write(it);
				buffy.newLine();
				fortschritt=fortschritt+0.2;
				bar.setValue((int)fortschritt);
			}

			buffy.close();
			setVisible(false);


			

			
		}

		catch(Exception e)
		{
			e.printStackTrace(); 		
		}
	}


}

Ich hoffe darauf, dass ihr mir mal wieder aus der Patsche helft.
Und dafür bedanke ich mich schon mal im vorraus ;-)
Der Programmierer
 
mal ganz fix zusammengebaut..allerdings musst du dann nochmal drueber laufen lassen, wegen den i's in diesem fall. geht aber wesentlich kuerzer und so!

Code:
List file1 = new ArrayList();
	List file2 = new ArrayList();

	try {
	    BufferedReader in = new BufferedReader(new FileReader("/home/jd/Desktop/file1.txt"));
	    String str;
	    while ((str = in.readLine()) != null) {
		if (!file1.contains(str))
		    file1.add(str);
	    }
	    in.close();
	} catch (IOException e) {
	}

	try {
	    BufferedReader in = new BufferedReader(new FileReader("/home/jd/Desktop/file2.txt"));
	    String str;
	    while ((str = in.readLine()) != null) {
		if (!file2.contains(str))
		    file2.add(str);
	    }
	    in.close();
	} catch (IOException e) {
	}

	String string = "";

	for (int i = 0; i < file1.size(); i++) {
	    string += "\n" + file1.get(i);
	}

	for (int i = 0; i < file2.size(); i++) {
	    string += "\n" + file2.get(i);
	}

	try {
	    BufferedWriter out = new BufferedWriter(new FileWriter("/home/jd/Desktop/file3.txt"));
	    out.write(string);
	    out.close();
	} catch (IOException e) {
	}
	System.out.println("ready");

gruesse
 
Mal ohne try-catches:

Code:
HashSet<String> list = new HashSet<String>();

String line;

BufferedReader br = new BufferedReader(new FileReader(datei1));
while ((line = br.readLine()) != null)
  list.add(line);
br.close();

BufferedReader br = new BufferedReader(new FileReader(datei2));
while ((line = br.readLine()) != null)
  list.add(line);
br.close();

PrintWriter pw = new PrintWriter(new FileWriter(datei1));
for (String s : list)
  pw.println(s);
pw.close();
 
in nem hashset sind die dann aber unsortiert und nicht so wie in der datei! die werden nicht geloescht, sie werden gliehc garnicht reingeschrieben...

gruesse
 
Mørketid hat gesagt.:
in nem hashset sind die dann aber unsortiert...

Huch, das habe ich ja vollkommen übersehen. 😳
In dem Fall muß natürlich ein TreeSet Verwendung finden.

Edit: Auch das ist ja Unsinn 😳 😳
Jetzt weiß ich auf Anhieb(*) auch nicht weiter! 🙁

(*) Also eine Collection die doppelte Einträge automatisch nicht aufnimmt ohne
die Reihenfolge zu ändern
 
warum nehmt ihr denn nicht meins? oder hab ich was falsch verstanden? aber mach dir ma nix draus...das mit dem hash war auch meine erste idee ;-).

gruesse
 
es ist egal in welcher reihenfolge die einträge sind. Es dürfen nur keine verloren gehen oder doppelt sein. Bei mir ging irgendwie die hälfte immer flöten! Wie oben gesagt!
 
Der Programmierer hat gesagt.:
ich hab jan Hashset aber irgendwie verflüchtigen sich einträge häufig/immer.

Das wohl weniger! 😎

Es ist allerdings so, daß mir deine Lösung zu umständlich ist um sie nach
Fehlern zu durchsuchen. Beispielsweise bestimmst du im Konstruktor die
Anzahl der Zeilen und nimmst darauf in der Methode run Bezug. Wozu? :autsch:
(Das ist bestimmt auch der Grund, warum auch Moerketid lieber einen eigenen
Lösungsweg geschrieben hat 😎 )

Meine Vorgehensweise müßte eigentlich direkt funktionieren;
hast du sie ausprobiert?
 
das hier funzt....

Code:
List file1 = new ArrayList();
	List file2 = new ArrayList();

	try {
	    BufferedReader in = new BufferedReader(new FileReader("/home/jd/Desktop/file1.txt"));
	    String str;
	    while ((str = in.readLine()) != null) {
		if (!file1.contains(str))
		    file1.add(str);
	    }
	    in.close();
	} catch (IOException e) {
	}
	Set temp = new HashSet(file1);
	file1 = new ArrayList(temp);
	try {
	    BufferedReader in = new BufferedReader(new FileReader("/home/jd/Desktop/file2.txt"));
	    String str;
	    while ((str = in.readLine()) != null) {
		if (!file1.contains(str))
		    file2.add(str);
	    }
	    in.close();
	} catch (IOException e) {
	}

	temp = new HashSet(file2);
	file2 = new ArrayList(temp);

	String string = "";

	for (int i = 0; i < file1.size(); i++) {
	    string += "\n" + file1.get(i);
	}

	for (int i = 0; i < file2.size(); i++) {
	    string += "\n" + file2.get(i);
	}

	try {
	    BufferedWriter out = new BufferedWriter(new FileWriter("/home/jd/Desktop/file3.txt"));
	    out.write(string);
	    out.close();
	} catch (IOException e) {
	}

kann man aber wie gesagt noch erheblich kuerzen!

gruesse
 
Also ohne deinen Code vollständig durchzulesen, fällt mir schon dies auf
Mørketid hat gesagt.:
das hier funzt....

Code:
List file1 = new ArrayList();
List file2 = new ArrayList();
...

Wozu benötigst du zwei ArrayListen, wenn doch nur eine HashSet ausreichen würde? ???:L
 
wie gesagt, geht noch um einiges kuerzer 😉...ein wenig refactoring wuerde danach nicht schaden...das steht fest.

gruesse
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben