Отображение списка массивов в Java - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь запустить этот код в 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);

и вывод:

[{Sex=f,Age=44,Name=bbb},{Sex=f,Age=44,Name=bbb}]

вместо

 [{Sex=m,Age=22,Name=aaa},{Sex=f,Age=44,Name=bbb}]
  • а. Что я делаю неправильно?
  • б. скажем, что вывод правильный. Как я могу распечатать только «Имя» значение StudentList [0], которое означает «aaa»?

Спасибо

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

У вас есть один экземпляр карты:

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

, который вы добавляете в список дважды.

Когда вы звоните 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));

Если вы просто хотите быстрое и грязное решение, вы можете использовать это:

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

, который создает второе HashMap для второго студента, таким образом гарантируя, что ключи от первой карты не будут переопределены.

0 голосов
/ 28 июня 2018

Вы создаете только один экземпляр карты. Отсюда и потеря записи. Пожалуйста, создайте два экземпляра карты, как показано ниже:

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

//First instance
Map<String, String> studentRecord1 = new HashMap();

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

//Second instance
Map<String, String> studentRecord2 = new HashMap();

//Record for second Student
studentRecord2.put("Name", "bbb");
studentRecord2.put("Age", "44");
studentRecord2.put("Sex", "f");
studentList.add(studentRecord2);
0 голосов
/ 28 июня 2018

Когда вы вызываете ".add ()" в вашем ArrayList - вы помещаете в него ссылку HashMap :

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

    studentRecord.put("Name","aaa");
    studentRecord.put("Age","222");
    studentRecord.put("Sex","m");
    studentList.add(studentRecord);
    studentList.forEach(map -> System.out.println(map.hashCode()));
    System.out.println("--------");


    studentRecord.put("Name","bbb");
    studentRecord.put("Age","44");
    studentRecord.put("Sex","f");
    studentList.add(studentRecord);
    studentList.forEach(map -> System.out.println(map.hashCode()));
}

Итак, вы меняете состояние HashMap и помещаете его снова. Выход будет:

2661442
--------
2612488
2612488

Итак, вы просто работаете с 1 объектом, а не с 2 разными объектами.

Похоже, вам нужен класс "Student", чтобы работать с ним, это будет больше "Java-style":

public class Main {

        public static void main(String[] args) {

            List<Student> students = new ArrayList<>();
            students.add(new Student("aaa", 222, "m"));
            students.add(new Student("bbb", 44, "f"));

            System.out.println(students);
    }
}

class Student {
    String name;
    Integer age;
    String sex;

    public Student(String name, Integer age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", sex='" + sex + '\'' +
            '}';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...