Verschachtelte Arraylist und deren Größe auslesen

  • Themenstarter Themenstarter Reiner Wissensdurst
  • Beginndatum Beginndatum
R

Reiner Wissensdurst

Gast
Hallo zusammen,
(ganz kurz):Bisher habe ich dieses Forum nur passiv genutzt, um meine vielen Programmierfragen als Java-Anfänger zu lösen. Das hat immer gut geklappt! Jetzt habe ich jedoch ein Problem, ohne auf die Lösung gestoßen zu werden:

Ich habe eine Arraylist. Diese enthält Objekte mit Namen und wiederum einer Arraylist.

Das Auslesen der verschaltelten Einträge in einer Schleife klappt nicht - und weil ich das Prinzip nicht verstanden habe, klappt auch das Auslesen der Anzahl der Einträge nicht.
Ich tippe mal, ich "caste" falsch. Nur wieso?

Thank you in advance.
Java:
package java_lernen;

import java.util.*;

public class Java_lernen {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Datensatz ds = new Datensatz();
        List<Datensatz> datenbank = new ArrayList<>();

        ds.setName("Wissensdurst");
      
        // mehrere Strings in einen Datensatz eintragen
        for (int i = 0; i <= 4; i++) {
            ds.setEintrag("Eintrag Nr.:" + i);
        }
        //Datensatz in Datenbank eintragen
        datenbank.add(ds);

        /*
        Problem:
        Ausgabe aller Einträge EINES Datensatzes in einer Schleife
  
        for ( <type> <variable> : <array> )
            <loop body>
        */
        
        // das geht NICHT!
     
        for (Datensatz elem: datenbank) {
            System.out.println( (String)datenbank.get(0).getEintrag(elem) );
        }
      
        // so soll das sein!
        System.out.println(datenbank.get(0).getEintrag(0));
        System.out.println(datenbank.get(0).getEintrag(1));
        System.out.println(datenbank.get(0).getEintrag(2));
        System.out.println(datenbank.get(0).getEintrag(3));
        System.out.println(datenbank.get(0).getEintrag(4));
        /*
        nächstes Problem:
        Wie ermittle ich die Anzahl der EINTRÄGE eines DATENSATZES?
        */
      
        // Gibt nur die Anzahl der Datensätze aus
        System.out.println(datenbank.size());
      
      
    }
}

class Datensatz {

    private String Name;
    private final ArrayList<String> eintrag;

    public Datensatz() {
        eintrag = new ArrayList<>();
    }

    public String getName() {
        return Name;
    }

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

    public void setEintrag(String datum) {
        eintrag.add(datum);
    }

    public String getEintrag(int nr) {
        String ein = eintrag.get(nr);
        return ein;
    }

}
 
Da Du die ArrayList Deiner Klasse Datensatz private gemacht hast und es keine Methode count in dieser Klasse gibt ist es nicht möglich die Anzahl der Strings in dem Datensatz zu ermitteln.

Gruß

Claus
 
Der Parameter von getEintrag ist doch falsch. Da gehört doch der index des Eintrages hin.
Und meinen tust du sicher: elem.getEintrag(<index>); ???

Damit hat er dann aber immer noch nicht alle Strings wie er es gerne hätte. Dummerweise bekommt er aber auch nicht heraus wieviele Strings überhauzpt in dem Datensatz sind. Also kann er auch keine Schleife erstellen die die Strings ausliest. Das ginge höchstens mit einer gewollten IndexOutOfBounds Exception was ziemlich unschön wäre...

Gruß

Claus
 
Schönen Dank erstmal.
@claus: Ich habe gelesen, dass Instanzvariablen immer "private" deklariert werden sollen und getter/setter immer public (HeadFirst Java, p.81). Aber auch wenn ich das ändere, habe ich leider noch keine Ahnung, wie ich in die verschachtelte ArrayList komme.
Der Gedanke, eine Methode count dafür zu schreiben, mag funktionieren, aber wenn ich z.B. weitere ArrayLists innerhalb von Datensatz bräuchte, müsste ich für jede wieder z.B. in einem Array die Anzahl der "counts" verwalten. Ok, geht, aber irgendwie finde ich es komisch.
List/ArrayList haben doch die Methode .size(). Wieso kann ich die denn nicht auch innerhalb der geschachtelten ArrayList benutzen? Das wäre für mich DIE Lösung.

@JStein52: Meinst du den Eintrag in der Zeile?
System.out.println( (String)datenbank.get(0).getEintrag(elem) );

Deinen Hinweis
elem.getEintrag(<index>);
verstehe ich leider nicht. Ist <index> ein Typ (wegen der spitzen Klammern)? Eigentlich sollte es ein index vom Typ int sein, stimmt, aber irgendwie ist mein Ansatz schrott. Ich habe es mal geändert
Java:
   int i = 0;
        for (Datensatz elem: datenbank) {
           
            System.out.println( (String)datenbank.get(0).getEintrag(i) );
            i++;
            System.out.println(i);
        }

und natürlich läuft die Schleife nur 1x durch. Ich habe ja auch nur einen DATENSATZ angelegt.

Scheinbar hängen beide Fragen zusammen:
1. Wie komme ich an die eingebettete ArrayList?
2. Wie komme ich an die Größe (z.B. mit .size()) der eingebetteten ArrayList?

Gruß,
Tobias
 
@JStein52: Es stimmt übrigens, mit dem Index komme ich ans Array. Danke für den Hinweis!! 🙂

Wenn ich jetzt noch die Größe der ArrayList herausbekäme, könnte ich den PC für heute glücklich ausschalten!

sowas eben (was ja nicht geht):
Code:
System.out.println( (String)datenbank.get(0).getEintrag(i).size() );

Gruß,
Tobias
 
Da hat Claus recht, da musst du wohl oder übel für jede Liste eine count-Funktion machen. Das private ist aus meiner Sicht auf jeden Fall in Ordnung.

U(nd noch ein Hinweis zu deiner Frage bzgl. elem :

Du iterierst doch über alle Elemente der datenbank und jedes einzelne davon wird in der Schleife via elem refenrenziert ! also elem.getEintrag(....)
 

Zurück
Oben