2017-11-04 4 views
1

Ich habe 3 Klassen wie folgt aus:Arraylist <object> innerhalb Arraylist <another> innerhalb einer Klasse

public class Subject { 
    String name; 
    ArrayList<Teacher> teachers; 

    public Subject(String name, ArrayList<Teacher> teachers) { 
     init(); 
     this.name = name; 
     this.teachers = teachers; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public ArrayList<Teacher> getTeachers() { 
     return teachers; 
    } 

    public void setTeachers(ArrayList<Teacher> teachers) { 
     this.teachers = teachers; 
    } 

    // 
    private void init() { 
     this.teachers = new ArrayList<>(); 
    } 
} 

public class Teacher { 
    String name; 
    ArrayList<DLink> dLinks; 

    public Teacher(String name, ArrayList<DLink> dLinks) { 
     init(); 
     this.name = name; 
     this.dLinks = dLinks; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public ArrayList<DLink> getdLinks() { 
     return dLinks; 
    } 

    public void setdLinks(ArrayList<DLink> dLinks) { 
     this.dLinks = dLinks; 
    } 

    // 
    private void init() { 
     this.dLinks = new ArrayList<>(); 
    } 
} 

und

public class DLink { 
    String URL; 

    public DLink(String URL) { 
     this.URL = URL; 
    } 

    public String getURL() { 
     return URL; 
    } 

    public void setURL(String URL) { 
     this.URL = URL; 
    } 
} 

Ich versuche, einige ArrayList<Subject> zu schaffen, aber ich weiß nicht, wie es zu tun. Ich habe versucht, so zu tun:

ArrayList<Subject> subjects = new ArrayList<>(); 
subjects.add(new Subject("S1", new ArrayList<Teacher>().add(new Teacher("T1", new ArrayList<DLink>().add(new DLink("D1"))))); 

Aber ich habe Syntaxfehler. Ich möchte die richtige Syntax kennen, um die objects Klasse der Subjektklasse zu manipulieren und wie man mehrere Werte von ArrayList<Teacher> & ArrayList<DLink> in einer einzigen Zeile für das Objekt der Subject Klasse hinzufügt. Dank ...

Antwort

1

Arraylist ist kein builder. Ein Builder ist eine Klasse, die sich in den Methoden zurück, so dass Sie solche Sachen tun können:

new SomeClass().someField().someField().build() 

und eine Instanz von SomeClass erhalten, wenn es endlich zurückkehrt.

ArrayList ist kein Builder. Dies bedeutet, dass die Rückgabewerte nicht in jeder Methode selbst sind.

Wenn Sie das tun:

new ArrayList<SomeClass>(); 

Sie erstellen eine neue Arraylist-Instanz.

Wenn Sie jedoch, dies tun:

new ArrayList<SomeClass>().add(new SomeClass()); 

, dass eine neue Instanz erstellt und fügt dann etwas zu. Jedoch:

Der Rückgabewert von add ist boolean. Nicht ArrayList. Wenn Sie diese Methode aufrufen, wird ein Boolescher Wert zurückgegeben, keine ArrayList.Und wenn man es so stapelt, ist es ähnlich zu tun:

someINstance.getField()/*returns an instance of a class*/.someInteger/*now you grab an integer*/ 

Um dies Sie zu beheben müssen separat die Arraylist erstellen:

ArrayList<Subject> subjects = new ArrayList<>(); 
List<Teacher> teachers = new ArrayList<>(); 
//then add to the ARrayList 
List<DLink> dLinks = new ArrayList<DLink>(); 
dLinks.add(new DLink("D1")); 
teachers.add(new Teacher("T1", dLinks); 
subjects.add(new Subject("S1", teachers)); 

Es ist eine extrem ineffiziente Art und Weise dies TBH zu tun, aber das ist die einzige Option, wenn ArrayList (oder irgendeine Liste für diese Angelegenheit) kein Builder ist

TL: DR; Da ArrayList kein Builder ist, erhalten Sie keine Instanz der Liste, wenn Sie .add aufrufen, was bedeutet, dass Sie die Instanz separat haben müssen. Sie kann nicht erstellt werden und Werte werden sofort hinzugefügt, wie Sie es versucht haben ein boolean es gibt nicht die Instanz der Arraylist Bedeutung


ein Codebeispiel von dem, was ich zu sagen versuchen:

public static void main(String[] args){ 
    int x = someMethod(); 
} 

public static void someMethod(){ 
    System.out.println("whatever"); 
} 

Samt mit Arraylisten. Der erste Teil gibt Ihnen eine Instanz, aber dann erhalten Sie eine Lücke als Rückgabetyp, was bedeutet, dass Sie keine Instanzen aus dem endgültigen Code erhalten.


Und nein, es gibt keine Möglichkeit, dies in einer einzigen Zeile zu tun, zumindest nicht in Java 8 und darunter.

+1

Vielen Dank für diese erstaunliche Erklärung :) – cuzifamif

0

Wenn Sie

subjects.add(new Subject("S1", new ArrayList<Teacher>().add(new Teacher("T1", new ArrayList<DLink>().add(new DLink("D1"))))); 

geben Sie im Grunde sagen 'subjects.add (neu Betreff ("S1", true), true)' weil Sie nicht die Referenz vorbei In das Array übergeben Sie die Ergebnisse der add-Methode, die laut java doc den Wert true zurückgibt, wenn die Addition kein Problem ergibt.

Versuchen Sie stattdessen:

ArrayList<Dlink> dlinkList = new ArrayList<>(); 
dlinkList.add("Test.url"); 

ArrayList<Teacher> teacherList = new ArrayList<>(); 
teacherList.add(new Teacher("Example name", dlinkList)); 

ArrayList<Subject> subjects = new ArrayList<>(); 
subjects.add(new Subject("S1", teacherList); 
+0

Gibt es keine Möglichkeit, all diese Dinge in nur einer Zeile zu tun? – cuzifamif

+0

Nicht, dass ich weiß, aber selbst wenn es möglich ist, schlage ich vor, dass Sie so klar wie möglich sind, das wird Ihnen später Zeit sparen. –

Verwandte Themen