Genau, das meinte ich die ganze Zeit, jetzt benötige ich ja nicht mehr meine ArrayList oder?
Hab jetzt die split-Funktion raus genommen, jedoch hab ich jetzt noch nen kleine Fehler beim befüllen des valuesArray, könntest du mir nochmal bitte kurz auf die Sprünge helfen
Mein erster Tipp wäre genau das gewesen, was nillehammer auch angedeutet (bzw. gelöst aber nicht explizit benannt) hat: Wenn man jede einzelne Zeile als EINEN String in eine Set speichert, fliegen Duplikate automatisch raus. Die Zeilen, die dann noch übrig bleiben, kann man splitten und weiterverarbeiten wie gehabt. Wenn man die Zeilen ERST splittet, dann hat man ja Arrays von Strings - und da kann man die Duplikate NICHT einfach entfernen indem man die Arrays in ein Set packt: Die Arrays sind ja immer unterschiedlich. Für zwei Arrays String s0[] und String s1[] gilt eben s0.equals(s1) == false, auch wenn sie den gleichen Inhalt haben.
Ja, „klappt nicht“ ist keine Fehlermeldung, bei der Du hilfreiche Hinweise erwarten kannst. Dass Dein Code die Originaldatei nicht verändert, sollte klar sein? Im Moment hast Du nur den ersten Schritt „Einlesen“ fertig. Die Duplikatsbereinigten Zeilen stehen erstmal nur im Set (also im RAM von Java). Dessen Inhalt müsste in einem zweiten Schritt natürlich noch wieder in eine Datei geschrieben werden.
Und dafür hat Dein Code einen kleinen Stolperstein. Durch die Deklaration des Sets innerhalb des try-catch-Blocks ist es nur dort sichtbar. Beim Zurückschreiben musst Du aber höchstwahrscheinlich von außerhalb dieses Blocks drauf zugreifen. Hol es also da raus:
// Einlesen
FileReader myFile = null;
BufferedReader buff = null;
Set<String> uniqueLines= new LinkedHashSet<>();
try {
...hier der ganze Einlesecode wie gehabt.
@Marco13 : Hab ich doch vor meinem Code genauso erklärt :eek: (Naja, nicht ganz so ausführlich…)
irgendetwas an meiner for Schleife
Da bekomm ich die Meldung “The left hand side of an assigment must be a variable” aber line ist doch eine Variable?
FileReader myFile = null;
BufferedReader buff = null;
myFile = new FileReader("Dateiausgabe.csv");
buff = new BufferedReader(myFile);
Set<String> uniqueLines= new LinkedHashSet<>();
try {
String line;
for((line = buff.readLine()) != null) {
if(!uniqueLines.contains(line)) {
System.out.println(line);
uniqueLines.add(line);
}}
```
Habe meinen Code jetzt so angepasst. Wie gesagt der Fehler ist halt noch die forschleife, da stimmt irgendetwas noch nicht.
@nillehammer : Ja ich hatte dann vor mit nem Filewriter die csv-Datei zu überschreiben, aber bis jetzt funktioniert meine Schleife ja noch nicht.
Nein. Nicht wenn der Wert sofort weiterverwendet werden soll wenn er noch nicht im Set ist. Dann verwendet man eben nur das Feature des schnellen Lookups.
Ich versteh jetzt nicht wieso er mir die neu erstellte Datei nicht befüllt
Da fehlt entscheidendes. closed du den OutputStream?
[QUOTE=javabeginner67]jedoch hab ich jetzt noch nen kleine Fehler beim befüllen des valuesArray, könntest du mir nochmal bitte kurz auf die Sprünge helfen
[/QUOTE]
Du versuchst einem String-Array eine String zuzuweisen!
Das kann nicht funktionieren
[QUOTE=javabeginner67;89514]Danke, aber da ist die for-Schleife glaub ich schon richtig
es geht um den Teil „= uniqueLines.add(line);“ → Cannot convert from boolean to string
Hab aber keine Ahnung wie ich hier sonst die gefilterten Datensätze mitreinbringen soll.[/QUOTE]
Andere Frage, ähnliches Problem …
Aber es darf hier wirklich keine for-Schleife sein! Es MUSS eine WHILE-Schliefe sein !!
Ja sorry. Das mit dem “for” in der Einleseschleife kam von mir. Hab’s halt schnell in den Editor geklickert. Die Lösung “while” ist ja schon genannt worden und in dem neuen Code auch bereits drinnen. Aber leider: Neuer Code neue Fehler:
Ein konzepzioneller: Man muss natürlich mit dem Einlesevorgang erst fertig sein, bevor man mit dem Rausschreibevorgang beginnen kann. Die for-Schleife zum Iterieren über die uniqueLines muss also NACH den ganzen Einlesecode, nicht da rein.
Der Code für die Iteration ist ja komplett verquer. Hier hast du willenlos Code zum Auslesen eines Writers und Code zum adden von Elementen in den Schleifenkopf gepackt. Suche bei google nach “java for each”. Dann findest du Beispiele, wie man richtig über eine Collection iteriert.
Beim Einleseschritt hast Du die Reader VOR der Schleife initialisiert. Das muss mit den Writern analog beim Rausschreiben natürlich auch so sein. Im Moment initialisierst Du bei jeder Zeile einen neuen Writer. Das ist natürlich Quatsch und wird vermutlich wegen Schreiblocks auf die Datei auch garnicht funktionieren.
[QUOTE=nillehammer]Ja sorry. Das mit dem “for” in der Einleseschleife kam von mir. Hab’s halt schnell in den Editor geklickert. Die Lösung “while” ist ja schon genannt worden und in dem neuen Code auch bereits drinnen. Aber leider: Neuer Code neue Fehler:
Ein konzepzioneller: Man muss natürlich mit dem Einlesevorgang erst fertig sein, bevor man mit dem Rausschreibevorgang beginnen kann. Die for-Schleife zum Iterieren über die uniqueLines muss also NACH den ganzen Einlesecode, nicht da rein.
Der Code für die Iteration ist ja komplett verquer. Hier hast du willenlos Code zum Auslesen eines Writers und Code zum adden von Elementen in den Schleifenkopf gepackt. Suche bei google nach “java for each”. Dann findest du Beispiele, wie man richtig über eine Collection iteriert.
Beim Einleseschritt hast Du die Reader VOR der Schleife initialisiert. Das muss mit den Writern analog beim Rausschreiben natürlich auch so sein. Im Moment initialisierst Du bei jeder Zeile einen neuen Writer. Das ist natürlich Quatsch und wird vermutlich wegen Schreiblocks auf die Datei auch garnicht funktionieren.[/QUOTE]
[QUOTE=schlingel]Nein. Nicht wenn der Wert sofort weiterverwendet werden soll wenn er noch nicht im Set ist. Dann verwendet man eben nur das Feature des schnellen Lookups.
[/QUOTE]
Kuckst du Set.add(E e);. Das liefert dir boolean zurück. true wenn der Wert noch nicht vorhanden ist ansonsten false.
if(uniqueLines.add(line)) {
Reicht, da dies intern sowieso contains aufruft. So spart man sich zweimal das Set durchzugehen.