类中的ArrayList <object>在类中的ArrayList <anotherobject>中

时间:2017-11-04 19:11:39

标签: java android arraylist

我有3个这样的课程:

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<>();
    }
}

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;
    }
}

我正在尝试创建一些ArrayList<Subject>,但我不知道该怎么做。我试着这样做:

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

但是我遇到了语法错误。我想知道操作Subject类objects的正确语法以及如何添加ArrayList<Teacher>&amp;的多个值。对于Subject类的对象,在一行中ArrayList<DLink>。 感谢...

2 个答案:

答案 0 :(得分:1)

ArrayList不是builder。构建器是一个在方法中返回自身的类,因此您可以执行以下操作:

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

并在最终返回时获取SomeClass的实例。

ArrayList 不是构建器。这意味着返回值本身并不是每个方法。

当你这样做时:

new ArrayList<SomeClass>();

您创建一个新的ArrayList实例。

但是,如果您这样做:

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

创建一个新实例,然后添加一些内容。的然而

add的返回值为boolean。不是ArrayList。这意味着当你调用该方法时,返回一个布尔值,而不是一个ArrayList。当你像那样堆叠它时,它类似于:

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

为了解决这个问题,你必须单独创建ArrayList:

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));

这是一种非常低效的方法,但是当ArrayList(或任何列表)不是构建器

时,这是唯一的选择。

TL:DR; 因为ArrayList不是构建器,所以当您调用.add时,您不会获得List的实例,这意味着您必须单独拥有该实例,它无法像你尝试的那样被创建并立即添加值,因为该方法是boolean意味着它不会返回ArrayList的实例

我想说的代码示例:

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

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

与ArrayLists相同。第一部分为您提供了一个实例,但是您会得到一个返回类型的void,这意味着您不会从最终代码中获取任何实例。

不,没有办法在一行中做到这一点,至少在Java 8及以下版本中没有。

答案 1 :(得分:0)

键入

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

你基本上是在说'subjects.add(新主题(“S1”,真),真)' 因为你没有将引用传递给数组,所以你传递的是add方法的结果,如果add没有给出任何问题,那么根据java doc返回true。

请改为尝试:

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);