# .txt Datei einlesen, verändern und in LinkedList speichern



## lennero (18. Jun 2017)

Hallo,
Ich komme bei dieser Aufgabe einfach nicht weiter.. Die Datei die bearbeitet werden soll habe ich unten angehangen. Ich denke das Problem sind die vielen verschiedenen Trennzeichen ...

Die Aufgabe lautet, schreiben sie eine Klasse "Stadt" mit zwei Attributen für den Namen der Stadt und eine LinkedList für die Postleitzahlen für diese Stadt.

Schreiben sie eine weitere Klasse welche aus der .txt Datei für jede Stadt die Postleitzahlen ermittelt und ein Stadt Objekt erzeugt. Dieses Objekt wird wieder in eine LinkedList gespeichert. Anschließend sollen die Städte mit den jeweiligen Postleitzahlen ausgegeben werden.

Ich habs jetzt mehrere Stunden probiert und glaube auch nicht dass ich allein weiterkomme ...


```
package a12;

import java.util.LinkedList;

public class Stadt{

    private String name;
    private LinkedList<Integer> blist = new LinkedList<Integer>();

    public Stadt(String name,LinkedList<Integer> blist){
        setName(name);
        setBlist(blist);
    }

    public void setName(String name){
        this.name=name;
    }

    public String getName(){
        return name;
    }

    public void setBlist(LinkedList<Integer> blist){
        this.blist=blist;
    }

    public LinkedList<Integer> getBlist(){
        return blist;
    }



}
```


```
package a12;

import java.io.*;
import java.util.LinkedList;
import java.util.Scanner;

public class StadtApp {

    public static void main(String[] args) {

        try {
            BufferedReader br = new BufferedReader(new FileReader("C:/Users/AID/Desktop/Postleitzahlen.txt"));
            LinkedList<Integer> plz = new LinkedList<Integer>();
            LinkedList<Stadt> sta = new LinkedList<Stadt>();
          
            String l = null;
            String[] l2 = null;
          
          
            Scanner sc = new Scanner(br);
          
            while(sc.hasNext()){
              
                if(sc.next().contains(",")&&sc.next().contains(" ")){
                    plz.add(Integer.parseInt(sc.next().substring(0, sc.next().length()-1)));
                }
              
                else if(sc.next().contains("-")){
                    l2 = sc.next().split("-");
                    plz.add(Integer.parseInt(l2[0]));
                    l = l2[1];
                }
              
          
                Stadt neu = new Stadt(l,plz);
              
            }
          
          
          
          
          
          

            br.close();
            sc.close();
          
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
```

edit : hier mal ein ausschnitt aus der txt, falls es jemand nicht herunterladen möchte

32545, 32547, 32549-Bad Oeynhausen
32105, 32107, 32108-Bad Salzuflen
50126, 50127, 50129-Bergheim
51427, 51429, 51465, 51467, 51469-Bergisch Gladbach
33615, 33617, 33619, 33647, 33649, 33659, 33689, 33699, 33719, 33729, 33739, 33602, 33604, 33605, 33607, 33609, 33611, 33613, 33519-Bielefeld
46395, 46397, 46399-Bocholt
44787, 44789, 44791, 44793, 44795, 44797, 44799, 44801, 44803, 44805, 44807, 44809, 44866, 44867, 44869, 44879, 44892, 44894-Bochum
53113, 53115, 53117, 53119, 53121, 53123, 53125, 53127, 53129, 53173, 53175, 53177, 53179, 53225, 53227, 53229, 53111-Bonn
46242, 46244, 46236, 46238, 46240-Bottrop
44575, 44577, 44579, 44581-Castrop-Rauxel
32760, 32756, 32758-Detmold
46535, 46537, 46539-Dinslaken


----------



## Meniskusschaden (18. Jun 2017)

Da sind noch mehrere Fehler enthalten. Der größte ist dein Gebrauch von `sc.next()`. Damit liest du jeweils das nächste Token ein. Diese Abfrage von dir:

```
if(sc.next().contains(",")&&sc.next().contains(" ")){
                    plz.add(Integer.parseInt(sc.next().substring(0, sc.next().length()-1)));
                }
```
bedeutet deshalb beispielsweise ungefähr folgendes:
Wenn das erste Token ein Komma enthält und das zweite Token ein Leerzeichen enthält, dann füge der Postleitzahlen-Liste den zum Integer konvertierten Teilstring hinzu, welcher in der Länge des vierten Tokens aus dem dritten Token ausgeschnitten werden soll.


----------



## lennero (18. Jun 2017)

Hi, danke für die Antwort.
Wenn ich den String sc.next in eine Variable packe sollte es dann theoretisch so funktionieren ?

Ich denke das Problem liegt daran, dass ich nur Scanner nutze, dieser geht ja den gesamten Text durch, statt wie von mir gewollt nur Zeilenweise. Wenn ich den BufferedReader nutze und dann Scanner(br.readLine()), sollte es klappen

Ich hab mal alle Zeilen bis auf die erste (in der .txt Datei) gelöscht, dann funktioniert es nämlich so wie es soll...


----------



## Meniskusschaden (18. Jun 2017)

lennero hat gesagt.:


> Wenn ich den String sc.next in eine Variable packe sollte es dann theoretisch so funktionieren ?


Ja, das ist besser.



lennero hat gesagt.:


> Ich hab mal alle Zeilen bis auf die erste (in der .txt Datei) gelöscht, dann funktioniert es nämlich so wie es soll...


Du benutzt die ganze Zeit dieselbe Liste für die Postleitzahlen. Du ordnest jeder Stadt diese Liste zu und fügst immer neue Postleitzahlen in die Liste ein. Zum Schluss sind dann allen Städten sämtliche Postleitzahlen zugeordnet. Das Problem tritt aber erst in Erscheinung, wenn du mehr als eine Zeile verarbeitest.


----------



## lennero (19. Jun 2017)

Meniskusschaden hat gesagt.:


> Ja, das ist besser.
> 
> 
> Du benutzt die ganze Zeit dieselbe Liste für die Postleitzahlen. Du ordnest jeder Stadt diese Liste zu und fügst immer neue Postleitzahlen in die Liste ein. Zum Schluss sind dann allen Städten sämtliche Postleitzahlen zugeordnet. Das Problem tritt aber erst in Erscheinung, wenn du mehr als eine Zeile verarbeitest.



Das sollte sich von selbst lösen, wenn ich jedesmal eine neue Liste, innerhalb der Schleife instanziere ?

Die Ausgabe stimmt jetzt, könnte schöner sein aber für mich passts jetzt. Danke für die Hilfe!


```
package a12;

import java.io.*;
import java.util.LinkedList;
import java.util.Scanner;

public class test {

    public static void main(String[] args) throws IOException {

       BufferedReader br = new BufferedReader(new FileReader("C:/Users/AID21/Desktop/walkking/Blatt 9/postleitzahlen.txt"));
       String l = null;
       LinkedList<Integer> plz;
       LinkedList<Stadt> sta = new LinkedList<Stadt>();
      
      
       while((l=br.readLine())!=null){
           Scanner sc = new Scanner(l);
           String l1 = null;
           String l2 = null;
           String l3 = null;
           plz = new LinkedList<Integer>();
          
           l3 = l.substring(l.indexOf("-")+1, l.length());
          
           while(sc.hasNext()){
               l1 = sc.next();
              
               if(l1.contains(",")){
                   l2 = l1.substring(0, l1.indexOf(","));
                   plz.add(Integer.parseInt(l2));
                 
               }
              
               if(l1.contains("-")){
                   l2 = l1.substring(0, l1.indexOf("-"));
                   plz.add(Integer.parseInt(l2));
                  
               }
              
            
            
             
           }
           sta.add(new Stadt(l3,plz));
           sc.close();
          
       }

       br.close();
      
       for(int i=0;i<sta.size();i++){
          
           System.out.println("PLZ für "+sta.get(i).getName()+" :");
          
           for(int j=0;j<sta.get(i).getBlist().size();j++){
               System.out.println(sta.get(i).getBlist().get(j));
              
           }
           System.out.println();
          
       }
     






    }

}
```


----------



## BadBat (2. Jul 2017)

```
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;


public class StadtApp {

    private StadtApp(){
   
    }
 
    public static  void createStadtFromTxt(String path) throws FileNotFoundException, IOException{       
        //try with resources ist autocloseable. Das bedeutet man muss nichts schließen br.close()
        try(BufferedReader br = new BufferedReader(new FileReader(path))){
            //splitted nur den Stadtnamen ab. Dieser ist erkennbar durch den ersten Bindestrich
            br.lines().forEach(line ->{ String[]splitted = line.split("[-]",2);
            //Speichert den Stadtnamen zwischen
            String name = splitted[(splitted.length) -1];
            //Splitted den großen plz String in kleine Teilelemente. Jedes Element ist eine Postleitzahl als String
            String[]plz = splitted[0].split("[\\p{Punct}, \\s]");
            LinkedList<Integer> plzLinked = new LinkedList<>();
            // Parst jede Postleitzahl zu einem int und fügt diesen int der Linked List zu
            for(String element : plz){if(!element.equals("")){plzLinked.add(Integer.parseInt(element));}}
            // Erzeugt eine neue Stadt
             new Stadt(name,plzLinked);});
        }
    }
 
}
```


----------



## mrBrown (2. Jul 2017)

BadBat hat gesagt.:


> ```
> // Parst jede Postleitzahl zu einem int und fügt diesen int der Linked List zu
> for(String element : plz){if(!element.equals("")){plzLinked.add(Integer.parseInt(element));}}
> ```


Das ist btw ein NoGo - solange etwas nicht eine Zahl sein muss, zB weil man damit rechnet, sollte man auch keine Zahl draus machen


----------



## BadBat (2. Jul 2017)

mrBrown hat gesagt.:


> Das ist btw ein NoGo - solange etwas nicht eine Zahl sein muss, zB weil man damit rechnet, sollte man auch keine Zahl draus machen


Ist aber im TE Code so deswegen hab ich es dabei belassen, aber reecht haste


lennero hat gesagt.:


> *private* LinkedList<Integer> blist = *new* LinkedList<Integer>();


----------

