Zeilen des ListArray nach einem Wort durchsuchen und diese Zeile ausgeben

Toxicspeed

Neues Mitglied
Hallo zusammen,

ich benötige eure Hilfe da ich nicht weis wie ichs angehen soll.
Ich habe folgenden Code:
Java:
static ArrayList<String> liste = new ArrayList<String>();

Java:
    public static void readFile(String filename) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(filename+".txt"));
        String line = null;
        while ((line = br.readLine()) != null) {
            liste.add(line);
        }
       
        for(String output : liste)
        {
            System.out.println(output);
        }
    }

Damit lese ich aus einer .txt Datei die einzelnen Zeilen aus und speicher sie in einer ArrayList<>.
Wenn ich es dann in der for-Schleife ausgebe passt soweit alles. Die Ausgabe sieht genauso aus wie der Inhalt der Datei.
Java:
150120,Franz,Müller
150111,Peter,Brand
140554,Sabine,Freund
150130,Emil,Sousa

Ich möchte jetzt die einzelnen Zeilen nach der Zahl absuchen, also z.B. 150120, und wenn dies in einer Zeile der ArrayList gefunden wird möchte ich diese Zeile zerlegen und die 3 Elemente des String je in einer Variable(nummer, vorname, nachname) speichern.

Ich hab nun aber keine wirkliche Idee wie ich dies angehen kann. Ich hab schon versucht "output" zu splitten. Dabei bekomm ich aber nur eine Adressierung von Java zurück.

Könnt ihr mir da bitte helfen?

Grüße
Edi
 
Du könntest einen StringTokenizer verwenden, um deine Zeilen bei den Kommata zu trennen. Das könnte dann so aussehen:
Java:
    public static void readFile(String filename) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(filename + ".txt"));
        ArrayList<String> liste = new ArrayList<>();
        String line = null;
        int i = 0;
        while ((line = br.readLine()) != null) {
            liste.add(line);                                    // fügt line zur Liste hinzu
            StringTokenizer st = new StringTokenizer(line, ",");// teilt line zwischen den Kommata (bei dir 3 Elemente)
            while (st.hasMoreElements()) {
                switch (i) {
                    case 0:
                        //Nummer in Variable speichern
                        i++;
                        break;
                    case 1:
                        //Vorname in Variable speichern
                        i++;
                        break;
                    case 2:
                        //Nachname in Variable speichern
                        i = 0;
                        break;
                    default:
                        break;
                }

            }
        }

        for (String output : liste) {
            System.out.println(output);
        }
    }

Je nachdem was du machen möchtest, kannst du auch deine Liste ersetzen bzw. streichen.
Du könntest eine Klasse "Person" anlegen, die die attribute (int nummer, String vorname, String nachname) besitzt, mit den jeweiligen Gettern/Settern bekommst du dann jeweils deine Attribute aus der Klasse.
Dann könntest du deine ArrayList<String> durch ArrayList<Person> ersetzen und damit weiterarbeiten 😉
 
Kannst Du evtl. einmal genau schreiben, was Du versucht hast. Die Aussage, dass Du nur eine Addressierung bekommst lässt mich vermuten, dass Du den String gesplittet hast in ein String-Array und dann dieses Array einfach mit System.out.println ausgegeben hast. Das ist aber nur eine Vermutung, da Du uns wichtige Details einfach nicht mitgeteilt hast.

Wenn dem so ist: Gib doch einfach das erste Element aus dem Array aus - oder überleg Dir, wie Du das ganze Array ausgeben könntest, denn das scheint ggf. nur Dein Problem zu sein.
 
Ich finde, die Aufgabenstellung ist ein perfekt zum Einsatz von Java 8:

Zunächst würde ich eine Klasse Person definieren:
Java:
    class Person {
        final int id;
        final String vorname;
        final String nachname;
        public Person(int id, String vorname, String nachname) {
            this.id = id;
            this.vorname = vorname;
            this.nachname = nachname;
        }
        public String toString() {
            return nachname + ", " + vorname + "ID: " + id;
        }

Die Methode zum Auffinden einer Person anhand seiner ID sähe dann so aus:
Java:
    public static Optional<Person> findePerson(int id, Path file) throws IOException {
        try(Stream<String> lines = Files.lines(file, Charset.defaultCharset())) {
            Optional<String> foundLine = lines
                    .filter(l -> l.startsWith(String.valueOf(id)))
                    .findAny();
            return foundLine.map(l -> {
                String[] tokens = l.split(",");
                return new Person(Integer.parseInt(tokens[0]), tokens[1], tokens[2]);
            });
        }
    }

Die Textdatei wird per Stream Zeile für Zeile abgearbeitet. Da der Eintrag mit der ID beginnt, reicht es mit Hilfe von startsWith() zu filtern. Ich gehe davon aus, dass es nur einen Eintrag zu einer ID gibt und verkürze die Suche daher mit findAny(). findAny() gibt ein Optional zurück, da ja die Möglichkeit besteht, dass kein Eintrag zu der gesuchten ID besteht.
Mit map() konstruiere ich aus dem Optional<String> ein Optional<Person>. Dafür unterteile ich den String mit split() an den Kommata.
 
Hallo zusammen,

also ich bin jetzt doch noch auf ne Lösung gekommen. Ich hab keine Ahnung ob das so ok ist aber sie tut was sie soll.
Java:
    public static String[] readFile(String filename, String search) throws IOException {    //Datei lesen und nach Nummer durchsuchen
        BufferedReader br = new BufferedReader(new FileReader(filename+".txt"));
        String line = null;
        while ((line = br.readLine()) != null) {
            liste.add(line);
        }
        for(int i = 0; i < liste.size(); i++) {                                                //Liste durchlaufen
            String[] stringLine = liste.get(i).split(";");                                    //jede Zeile an ; aufsplitten
            String searchLine = stringLine[0];                                                //Erste Position im Array auslesen, ist immer die ID
            if (searchLine.equals(search)) {                                                //Vergleiche mit übergebenem Suchstring
                br.close();                                                                    //Schließe den BufferedReader
                return stringLine;                                                            //Gib den STringArray der richtigen Zeile zurück und beende die Suche
            }
        }
        br.close();
        return null;
    }

Danke auch für die Anregungen von euch.
 

Zurück
Oben