对象实例中的列表列表(java)

对象实例中的列表列表(java),java,list,object,Java,List,Object,我定义了一个班级“学生”。类的每个实例都有一个名称和n*m首选项(都是字符串) 公共班级学生{ 字符串名; 列表选项=新建ArrayList(); 公立学生(字符串名称1,列表首选项){ this.firstName=name1; this.choice.addAll(首选项); } } 接下来,我有一个列表,其中可以保存每个学生对象 List<Student> students = new ArrayList<Student>(); List students=ne

我定义了一个班级“学生”。类的每个实例都有一个名称和n*m首选项(都是字符串)

公共班级学生{
字符串名;
列表选项=新建ArrayList();
公立学生(字符串名称1,列表首选项){
this.firstName=name1;
this.choice.addAll(首选项);
}
}
接下来,我有一个列表,其中可以保存每个学生对象

List<Student> students = new ArrayList<Student>();
List students=new ArrayList();
现在的问题是,当我在列表中保存一个学生时,它工作正常。但是,当我将第二个学生添加到列表中时,第一个学生的首选项将被覆盖。我添加和读取数据如下:

List<List<String>> preferences = new ArrayList<List<String>>();
List<String> preferences1 = new ArrayList<String>();
List<String> preferences2 = new ArrayList<String>();


// add first student
preferences.clear(); preferences1.clear(); preferences2.clear();
preferences1.add("Company1"); preferences1.add("Company3");
preferences2.add("Company2"); preferences2.add("Company4");
preferences.add(preferences1); preferences.add(preferences2);
students.add(new Student("Michiel", preferences));

// add second student
preferences.clear(); preferences1.clear(); preferences2.clear();
preferences1.add("Company5"); preferences1.add("Company7");
preferences2.add("Company6"); preferences2.add("Company8");
preferences.add(preferences1); preferences.add(preferences2);
students.add(new Student("William", preferences));

System.out.println(students.get(0).choice);
System.out.println(students.get(1).choice);
List preferences=new ArrayList();
列表首选项1=新的ArrayList();
列表首选项2=新的ArrayList();
//添加第一个学生
preferences.clear();首选项1.clear();首选项2.clear();
优先权1.添加(“公司1”);优先权1.添加(“公司3”);
优先权2.添加(“公司2”);优先权2.添加(“公司4”);
首选项。添加(首选项1);首选项。添加(首选项2);
添加(新学生(“Michiel”,首选项));
//添加第二个学生
preferences.clear();首选项1.clear();首选项2.clear();
优先权1.添加(“公司5”);优先权1.添加(“公司7”);
优先权2.添加(“公司6”);优先权2.添加(“公司8”);
首选项。添加(首选项1);首选项。添加(首选项2);
添加(新学生(“威廉”,首选项));
System.out.println(students.get(0.choice));
System.out.println(students.get(1.choice));
出什么事了?我已经在课堂上试过“期末考试”


一个小问题,你建议使用Arraylist还是List?

当你添加下一个
学生时,你不能重复使用相同的
List
。您保存的只是一个引用,因此稍后清除它将清除所有保存的首选项。为每个
学生创建新的
首选项列表
s,您就可以:

...

preferences = new ArrayList<List<String>>();
preferences1 = new ArrayList<String>();
preferences2 = new ArrayList<String>();

// add second student
preferences1.add("Company5"); preferences1.add("Company7");
preferences2.add("Company6"); preferences2.add("Company8");
preferences.add(preferences1); preferences.add(preferences2);
students.add(new Student("William", preferences));
。。。
首选项=新的ArrayList();
preferences1=新的ArrayList();
preferences2=新的ArrayList();
//添加第二个学生
优先权1.添加(“公司5”);优先权1.添加(“公司7”);
优先权2.添加(“公司6”);优先权2.添加(“公司8”);
首选项。添加(首选项1);首选项。添加(首选项2);
添加(新学生(“威廉”,首选项));
一个小问题,你建议使用Arraylist还是List

你正在做的看起来很好。您需要选择
列表
接口的一些具体实现,并且您选择了非常合理的
ArrayList


此外,您正在声明接口类型的变量
列表
,这是执行此操作的首选方法。

您需要为每个学生创建一个新的首选项列表,如下所示:

    List<List<String>> preferences1 = new ArrayList<List<String>>();
    List<String> preferences1 = new ArrayList<String>();
    List<String> preferences2 = new ArrayList<String>();


    // add first student
    preferences.clear(); preferences1.clear(); preferences2.clear();
    preferences1.add("Company1"); preferences1.add("Company3");
    preferences2.add("Company2"); preferences2.add("Company4");
    preferences.add(preferences1); preferences.add(preferences2);
    students.add(new Student("Michiel", preferences));

    // add second student

 List<List<String>> secondPreferences = new ArrayList<List<String>>();
    List<String> secondPreferences2 = new ArrayList<String>();
    List<String> secondPreferences3 = new ArrayList<String>();

// preferences1.clear(); preferences2.clear(); preferences3.clear(); // you don't need to clear those ! as they are new lists

    secondPreferences2.add("Company5"); secondPreferences2.add("Company7");
    secondPreferences3.add("Company6"); secondPreferences3.add("Company8");
    secondPreferences.add(preferences1); secondPreferences.add(preferences2);
    students.add(new Student("William", secondPreferences));

    System.out.println(students.get(0).choice);
    System.out.println(students.get(1).choice);
List preferences1=newarraylist();
列表首选项1=新的ArrayList();
列表首选项2=新的ArrayList();
//添加第一个学生
preferences.clear();首选项1.clear();首选项2.clear();
优先权1.添加(“公司1”);优先权1.添加(“公司3”);
优先权2.添加(“公司2”);优先权2.添加(“公司4”);
首选项。添加(首选项1);首选项。添加(首选项2);
添加(新学生(“Michiel”,首选项));
//添加第二个学生
List secondPreferences=new ArrayList();
List secondPreferences2=new ArrayList();
List secondPreferences3=新建ArrayList();
//首选项1.clear();首选项2.clear();首选项3.clear();//你不需要清除那些!因为它们是新的列表
第二优先权2.添加(“公司5”);第二优先权2.添加(“公司7”);
第二优先权3.添加(“公司6”);第二优先权3.添加(“公司8”);
添加(首选项1);添加(首选项2);
添加(新学生(“威廉”,第二偏好));
System.out.println(students.get(0.choice));
System.out.println(students.get(1.choice));

祝你好运

你应该每次都创建一个新的列表,而不是清除
首选项
列表。如果我这样做,那么带有clear()的行是否仍然是必需的?此外,当我为每个学生添加一个新列表时,该列表需要比前一个名称更大的名称。编辑:这不是真的,我将其定义为List preferences=new ArrayList();而不是首选项=new ArrayList();非常感谢@米切尔:不,这个名字无关紧要,它只是一个参考。只要每次都指向一个新的
列表
,使用相同的引用就没有问题。在这个答案中,每个学生都需要一个新的名字。因此,我更喜欢第一个答案,因为我不知道学生人数。学生的名字与参考文献列表有什么关系?我指的是参考文献的名称,在你的例子中是第二个首选项2。
    List<List<String>> preferences1 = new ArrayList<List<String>>();
    List<String> preferences1 = new ArrayList<String>();
    List<String> preferences2 = new ArrayList<String>();


    // add first student
    preferences.clear(); preferences1.clear(); preferences2.clear();
    preferences1.add("Company1"); preferences1.add("Company3");
    preferences2.add("Company2"); preferences2.add("Company4");
    preferences.add(preferences1); preferences.add(preferences2);
    students.add(new Student("Michiel", preferences));

    // add second student

 List<List<String>> secondPreferences = new ArrayList<List<String>>();
    List<String> secondPreferences2 = new ArrayList<String>();
    List<String> secondPreferences3 = new ArrayList<String>();

// preferences1.clear(); preferences2.clear(); preferences3.clear(); // you don't need to clear those ! as they are new lists

    secondPreferences2.add("Company5"); secondPreferences2.add("Company7");
    secondPreferences3.add("Company6"); secondPreferences3.add("Company8");
    secondPreferences.add(preferences1); secondPreferences.add(preferences2);
    students.add(new Student("William", secondPreferences));

    System.out.println(students.get(0).choice);
    System.out.println(students.get(1).choice);