Input/Output Hat eclipse eine Macke oder mein Code Array Datei einlesen

stylegangsta

Bekanntes Mitglied
Hallo zusammen,

ich habe folgendes Problem:
Es wird eine Datei mit Zahlenwerten in ein Array eingelesen. Alle Werte > 59 werden gezählt und die Anzahl der Elemente ausgegeben.

Ich hatte zum Testen das Programm 2x erstellt. MergeSort und MergeSort2. In MergeSort2 habe ich herumprobiert und es hat funktioniert.

In meiner Beispieldatei habe ich 3 Werte, die > 59 sind.
Die Ausgabe lautete dann: Sie haben 3 Rentenanwärter

Den Code habe ich mit STRG+A komplett markiert und STRG+X ausgeschnitten. Anschließend habe sowohl die MergeSort und MergeSort2 Klassen gelöscht. Dann eine neue MergeSort erstellt und den Code mit STrg+V hineinkopiert und die zweien von MergeSort2 entfernt, so dass es auf den Klassennamen MergeSort angepasst wurde.

Wenn ich jetzt starte kommt als Ausgabe: Sie haben 0 Mitarbeiter, obwohl es 3 sein müssen.

Ich kann mir nicht vorstellen versehentlich etwas verschoben zu haben oder was im Code. Kann mir bitte jemand helfen? Wenn dann müsste ich ja was aus der Main und Ausgabe beim Ausschneiden vermurxt haben, aber ich seh nix mehr vor lauter Code gucken 🙂

Das ist der Code:
Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class MergeSort { 

	//Mainmethode und Ausgabe
	public static void main(String[] args) throws IOException {

		FileReader fr = new FileReader("C:\\Users\\Yücel\\Desktop\\alter.txt");
		BufferedReader br = new BufferedReader(fr);

		FileReader fr2 = new FileReader("C:\\Users\\Yücel\\Desktop\\ausgabeteil1.txt");
		BufferedReader br2 = new BufferedReader(fr2);

		FileReader fr3 = new FileReader("C:\\Users\\Yücel\\Desktop\\ausgabeteil2.txt");
		BufferedReader br3 = new BufferedReader(fr3);

		int anzahlPotenzielleRentenAnwaerter = 0; {	
			if (fr != null) {	

				MergeSort ms = new MergeSort(); 
				int[] arr = ms.sort(0, intArr.length - 1);
				for (int i = 0; i < arr.length; i++) {
					if (arr[i] > 59) {
						anzahlPotenzielleRentenAnwaerter++;
					}
				}
			}

			String ausgabeTeil1 = "";
			String ausgabeTeil2 = "";

			do {
				ausgabeTeil1 = br2.readLine();
				ausgabeTeil2 = br3.readLine();
				System.out.println(ausgabeTeil1 + anzahlPotenzielleRentenAnwaerter + ausgabeTeil2);	
			}while (ausgabeTeil1 == null);
		}

		br.close();
		br2.close();
		br3.close();
	}

	public static int[] intArr = { };

	public int[] sort(int l, int r) { 

		/**Teile
		 * Aufteilung der gesamten Werte in 2 Hälften bis es nicht mehr geht
		 */
		if (l < r) { 
			int q = (l + r) / 2; 

			sort(l, q); 
			sort(q + 1, r); 
			merge(l, q, r); 
		} 
		return intArr; 
	} 

	/**Herrsche
	 * Algorithmus
	 * hier werden
	 * die Werte in aufsteigender
	 * Reihenfolge sortiert
	 * und "verschmolzen"
	 */
	private void merge(int l, int q, int r) {

		int[] arr = new int[intArr.length]; 
		int i;
		int j;

		for (i = l; i <= q; i++) { 
			arr[i] = intArr[i]; 
		} 

		for (j = q + 1; j <= r; j++) { 
			arr[r + q + 1 - j] = intArr[j]; 
		} 

		i = l; 
		j = r; 

		for (int k = l; k <= r; k++) { 
			if (arr[i] <= arr[j]) { 
				intArr[k] = arr[i]; 
				i++; 
			} else { 
				intArr[k] = arr[j]; 
				j--; 
			}
		}
	}
}
 
Ich habe mir deinen Code nicht angeschaut, aber wenn du versuchst, einen Fehler zu finden, solltest du methodisch vorgehen:

Bis zu welchem Punkt sieht alles so aus, wie es sollte?
Wann nicht mehr?

Du kannst mit System.out.println oder mit dem Debugger von Eclipse arbeiten (ich präferiere letzteres, habe aber auch Kollegen, die lieber Konsolenausgaben machen lassen).
 
Ich habe mir deinen Code nicht angeschaut, aber wenn du versuchst, einen Fehler zu finden, solltest du methodisch vorgehen:

Bis zu welchem Punkt sieht alles so aus, wie es sollte?
Wann nicht mehr?

Hallo Saheeda,

danke für deine zügige Antwort. Das Problem ist ja, dass der Code, so wie ich ihn hier eingefügt habe astrein (oder zumindest so, wie ich es will) funktioniert hat. Ich hab ihn dann einfach kopiert und im Anschluss lediglich den Klassennamen angepasst. Sonst nichts geändert und plötzlich hatte ich dann ein falsches Ergebnis. Aber ich versuche es mal mit dem Debugger, wobei ich mit dem nicht wirklich gut zurecht komme.
 
So wie der Code hier steht, kann er nie funktioniert haben. Du hast eine statische Variable "intArr", die als leeres Array angelegt wird.
Wenn man den Programmfluß nachvollzieht, dann kommt man an keine Stelle, an der sich das ändert.
Also "intArr" bleibt leer, sodass auch dein "anzahlPotenzielleRentenAnwaerter" 0 bleibt.

Die Zeile 19 sieht mir seltsam formattiert aus. Hast du da vielleicht etwas rausgelöscht ?
 
So wie der Code hier steht, kann er nie funktioniert haben. Du hast eine statische Variable "intArr", die als leeres Array angelegt wird.
Wenn man den Programmfluß nachvollzieht, dann kommt man an keine Stelle, an der sich das ändert.
Also "intArr" bleibt leer, sodass auch dein "anzahlPotenzielleRentenAnwaerter" 0 bleibt.

Die Zeile 19 sieht mir seltsam formattiert aus. Hast du da vielleicht etwas rausgelöscht ?

Danke für die Antwort, ich muss da beim Ausschneiden irgendwie Mist gemacht haben und bekomme es nicht mehr Rückgängig, vor allem, weil eclipse zwischendurch beendet hatte. Aber Zeile 19 ist genau die Stelle, wo der Debugger nicht in die Schleife reingeht.
 
GELÖST: Viel weg gewesen, aber auch einiges umgebaut

Ich weiß nicht, was ich beim "Ausschneiden" verbrochen habe, aber es scheint einiges verschwunden zu sein. Jetzt ist aber alles wieder gut und noch einiges umgebaut.

Das ist der Code, wie ich ihn wollte:
Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class MergeSort {

	// Alter der Mitarbeiter
	public static int[] intArr = new int[32];

	// Ausgabetextbausteine
	private static String[] Text = new String[16];

	// Mainmethode und Ausgabe
	public static void main(String[] args) throws IOException {

		FileReader fr = new FileReader(
				"C:\\meinLaufwerkspfad\\alter.txt");
		BufferedReader br = new BufferedReader(fr);

		FileReader fr2 = new FileReader(
				"C:\\meinLaufwerkspfad\\ausgabetext.txt");
		BufferedReader br2 = new BufferedReader(fr2);

		int k = 0;
		while ((Text[k++] = br2.readLine()) != null);

		if (fr != null) {

			MergeSort ms = new MergeSort();
			String Zeile;
			int anzahlPotenzielleRentenAnwaerter = 0;
			k = 0;
			while ((Zeile = br.readLine()) != null) {
				intArr[k++] = Integer.parseInt(Zeile);
			}

			int[] arr = ms.sort(0, intArr.length - 1);
			System.out.println(Text[0]);
			for (int i = 0; i < arr.length; i++) {
				if (arr[i] > 59) {
					anzahlPotenzielleRentenAnwaerter++;
					System.out.print(arr[i] + ((i < arr.length - 1) ? ", " : ";\n"));
				}
			}

			System.out.println("\n" + Text[1] + " "
					+ anzahlPotenzielleRentenAnwaerter + " " + Text[2]);
			for(int i = 3; i < 11; i++)
				System.out.println(Text[i]);
		}

		br.close();
		br2.close();
	}

	public int[] sort(int l, int r) {

		/**
		 * Teile: Aufteilung der gesamten Werte in 2 Hälften bis es nicht mehr
		 * geht
		 */
		if (l < r) {
			int q = (l + r) / 2;

			sort(l, q);
			sort(q + 1, r);
			merge(l, q, r);
		}
		return intArr;
	}

	/**
	 * Herrsche: Algorithmus hier werden die Werte in aufsteigender Reihenfolge
	 * sortiert und "verschmolzen", man kann sie beherrschen
	 */
	private void merge(int l, int q, int r) {

		int[] arr = new int[intArr.length];
		int i;
		int j;

		for (i = l; i <= q; i++) {
			arr[i] = intArr[i];
		}

		for (j = q + 1; j <= r; j++) {
			arr[r + q + 1 - j] = intArr[j];
		}

		i = l;
		j = r;

		for (int k = l; k <= r; k++) {
			if (arr[i] <= arr[j]) {
				intArr[k] = arr[i];
				i++;
			} else {
				intArr[k] = arr[j];
				j--;
			}
		}
	}
}
 
Zuletzt bearbeitet:

Zurück
Oben