Hey ich habe eine Aufgabe bekommen, in der ich aus einem Textdokument Telefonnummern auslesen soll, die Duplikate entfernen und anschließend alles in ein neues Dokument schreiben soll. Das Auslesen der Datei funktioniert schonmal. Ich möchte jetzt jeden Wert innerhalb des Arrays miteinander mithilfe von equals vergleichen um Duplikate zu finden und diese anschließend auf 0 zu setzen. So kann ich hinterher mithilfe von der If-Anweisung alle Werte mit 0 beim Neu Schreiben auslassen.
Mein Problem ist nun das beim Testen der Werte untereinander eine NullPointerException bekomme und ich nicht ganz durchblicke was genau ich jetzt tun soll. hoffe mir kann jemand helfen.
Java:
//Name: //Uebung 1 Aufgabe 2bimportjava.io.FileReader;importjava.io.BufferedReader;importjava.io.IOException;class nummer {publicstaticvoid main (String[]args)throwsIOException{//Den Text aus der Datei Zeilenweise auslesenFileReader fr =newFileReader("Nr.txt");BufferedReader br =newBufferedReader(fr);String[] oldArr =newString[100];String[] newArr =newString[100];String zeile=br.readLine();//Die Zeilen in einem Array speichern (und testweise abfragen)int i=0;while(zeile!=null){
oldArr[i]=zeile;System.out.println(oldArr[i]);
zeile=br.readLine();
i++;}//Jede zeile untereinander miteinander vergleichen, und falls eine doppelt ist diese 0 setzenint j=0;for(j=0;j<=i;j++){for(int k=0;k<=i;k++){if(oldArr[j].equals(oldArr[k])){
oldArr[k]="0";}}}//testweise Ausgabe ob doppelte 0 gesetzt wurdeSystem.out.println();for(int z=0;z<=20;z++){System.out.println(oldArr[z]);}}}
nun, so denn die Zeilenangabe stimmt, wird dort 'oldArr' wohl null sein .... :autsch:
Sicher, dass beim 'println' im Block vorher wirklich was ausgegeben wird ???:L
hmm, ich würde jetzt statt einer NPE eher IndexOutBound-Exception erwarten!
Wieviele Zeilen sollen genau eingelesen werden (wie groß ist 'i') ?
Wieviele Zeilen werden korrekt eingelesen?
Prüf' mal im Debugger wie die Werte von 'j' und 'k' zum Zeitpunkt des Absturzes stehen (oder lass' sie in jedem Durchlauf in der Konsole ausgeben) !
Zudem denke ich, dass in allen for-Schleife nur auf < und nicht <= geprüft werden sollte, da es sonst zur erwähnten Indexverletzung kommen wird! Wenn Du 10 Zeilen einliest, läuft der Index im Array ja von 0 - 9 !!
Er liest 16 Zeilen ein also müsste i bei 16 stehen. Der Array selbst hat eine Größe von 100. Dieser sollte eigentlich unbegrenzt sein, aber das ist eine Problematik mit der ich mich später beschäftigen wollte. Das mit den for-schleifen kann ich probieren, bei dem rest was du gesagt hast muss ich ehrlich gesagt zugeben, dass ich keine Ahnung habe was du meinst, bzw. wie das funktioniert :noe:
Edit:
Okay das mit der Änderung innerhalb der for-Schleifen gab schonmal eine Änderung in der Ausgabe. Zwar nicht das was ich erhofft habe, aber immerhin etwas. Dann schau ich mal wie es jetzt weiter geht.
Neue Ausgabe:
C:\Users\Ich\Desktop\Uni\2. Semester\Datenstrukturen und effiziete A
lgorithmen\Übung\Hausaufgabe 1>java nummer
05846979274
11537843154
18641536733
18613513547
23712846184
36459255596
27361872363
11122233344
05846979274
58694763843
32443245325
32423523528
12381964574
98781725362
12381687444
11122233344
Nunja, du vergleichst jeden Eintrag mit jedem. Da muss doch nachher alles "0" sein. Du must die innere Schleife immer bei der äußeren +1 beginnen lassen um das zu verhindern.
Dabei solltest du dann aber wieder beachten, dass du dann die äußerer Schleife auch nur bis i-2 laufen lassen darfst.
Okay das kann ich vom logischen nicht ganz nachvollziehen, da ich dachte das beide Variablen welche den Array mit hochzählen bei 0 anfangen müssten, so wie eben der Array selbst
Java:
//Jede zeile untereinander miteinander vergleichen, und falls eine doppelt ist diese 0 setzenint j=0;for(j=0;j<i-1;j++){for(int k=1;k<i;k++){if(oldArr[j].equals(oldArr[k])){
oldArr[k]="0";}}}
Entspricht das dem was du gemeint hast? habe k in der inneren Schleife um 1 erhöht und j bei der äußeren Schleife auf i-2 laufen lassen. Wobei ich es ja eigentlich eh gleich probieren werde
Edit:
Ich sehe schon, du hast Recht, das Ergebnis ist anders aber diesmal sind in der Ausgabe 2 richtige Zahlen enthalten, der Rest ist 0. Muss also irgendwo nochwas falsch sein.
Habe immer Probleme zu verstehen wo und bis wann welche Schleife zählen muss.
Am einfachsten ist es Du malst dir das einfach mal auf. Links der Index, rechts der Inhalt. Also
0 12345
1 23456
2 34567
3 45678
4 56789
So, was machst du jetzt im Moment in Deinem Programm?
Du nimmst den ersten Eintrag (j=0) und dann in der inneren Schleife den zweiten Eintrag (k=1) und vergleichst diese. Also
12345 == 23456 ? Du stellst fest: NE sind sie nicht also bleibt der zweite Eintrag so wie er ist.
Das machst du mit allen Einträgen in der inneren Schleife. Dann nimmst du den zweiten Eintrag (j=1) und vergleichst ihn mit dem zweiten Eintrag (k=1) was natürlich gleich ist. Also wird der zweite Eitnrag "0".... Fehler! Das willst du ja gar nicht.
Jetzt überleg Dir einfach mal wie Du es von Hand machen würdest und das implementierst du dann in dein Programm.
Ai, jetzt wo du es sagst sehe ich auch den fehler. Da müsste ich erstmal ne Weile drüber nachdenken, spontan fällt mir nichts ein. Vielleicht könnte man mithilfe von einer if Anweisung prüfen ob die referenz der Arrays in beiden Schleifen gleich ist, und sofern dies der Fall ist dann das auslassen.
Edit:
Super, ich habs voll drauf Danke, einziges Problem ist nur das ich am Ende noch 4 mal die Ausgabe "null" habe, aber das heißt ja nur, dass ich irgendeine Schleife zu weit laufen lasse.