java中数组列表的映射

eya*_*506 -1 java mapping

我试图在java中运行这段代码:

List<Map<String , String>> studentList = new ArrayList<>();
Map<String , String> studentRecord = new HashMap();

//Record for first Student
studentRecord.put("Name","aaa");
studentRecord.put("Age","22");
studentRecord.put("Sex","m");
studentList.add(studentRecord);

//Record for second Student
studentRecord.put("Name","bbb");
studentRecord.put("Age","44");
studentRecord.put("Sex","f");
studentList.add(studentRecord);
Run Code Online (Sandbox Code Playgroud)

输出是:

[{Sex=f,Age=44,Name=bbb},{Sex=f,Age=44,Name=bbb}]
Run Code Online (Sandbox Code Playgroud)

代替

 [{Sex=m,Age=22,Name=aaa},{Sex=f,Age=44,Name=bbb}]
Run Code Online (Sandbox Code Playgroud)
  • A。我究竟做错了什么?
  • b. 假设输出是正确的。如何仅打印 StudentList[0] 的“Name”值(表示“aaa”)?

谢谢

Mic*_*ael 5

您有一个地图实例:

Map<String , String> studentRecord = new HashMap();
Run Code Online (Sandbox Code Playgroud)

您将其添加到列表中两次。

当您调用studentRecord.put第二个学生时,您是在唯一的地图实例上调用它,从而覆盖第一个学生的键。

最好的解决方案是:不要使用映射来表示数据对象。使用一个类。这就是它们的设计目的。

enum Sex
{
    MALE, FEMALE
}

class Student
{
    private final String name;
    private final int age;
    private final Sex sex;

    Student(String name, int age, Sex sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    // getters...
}

List<Student> students = new ArrayList<>();
students.add(new Student("aaa", 222, Sex.MALE));
students.add(new Student("bbb", 44, Sex.FEMALE));
Run Code Online (Sandbox Code Playgroud)

如果你只是想要快速而肮脏的解决方案,你可以使用这个:

//Record for second Student
studentRecord = new HashMap<>(); // I added this line

studentRecord.put("Name","bbb");
studentRecord.put("Age","44");
studentRecord.put("Sex","f");
studentList.add(studentRecord);
Run Code Online (Sandbox Code Playgroud)

这会为第二个学生创建第二个HashMap,从而确保第一个地图中的键不会被覆盖。