Список повторяющихся объектов java с одним другим полем/свойством

#java #oop #arraylist

Вопрос:

Моя база данных возвращает мне список дублированных объектов java, в которых только 1 свойство отличается, т. е. курс.например, для 1 студента: 2 объекта студента для 2 разных курсов. Я создал класс модели, в котором я хочу заполнить объект student, поступающий из бд. Для курса в классе модели я создал список строк.

Итак, для каждого студента: я хочу добавить его курс в список и заполнить другие поля модели

Студенческий класс:

 public class Student {

    private String name;
    private int id;
    private String email;
    private String course;
}
 

Класс студенческой модели:

 public class StudentModel {
    private String name;
    private int id;
    private String email;
    private List<String> course;

}
 

У меня есть :

 Student student1("Tom",1,"tom@email.com","JAVA");
Student student2("Tom",1,"tom@email.com","DSA");
Student student3("JERRY",2,"jerry@email.com","C#");
 

Я хочу иметь что-то вроде этого:

 StudentModel{name='TOM', id=1, email='TOM@email.com', course=[JAVA, DSA]}
StudentModel{name='Jerry', id=2, email='jsk@email.com', course=[C#]}

 

Я пытаюсь вот так:

         List<String> course = new ArrayList<>();

        int id = studentList.get(0).getId();
        studentModel=new StudentModel();

       for(Student student : studentList){

            if(id == student.getId()){
                course.add(student.getCourse());
                studentModel.setCourse(course);
            }
            else {
                id = student.getId();
                //studentModel.setCourse(course);
                course.clear();
                course.add(student.getCourse());
                StudentModel studentModel = new StudentModel();
                studentModel.setCourse(course);
         }
            studentModels.add(studentModel);
        }
 

Что может быть еще одним способом сделать это?

Комментарии:

1. В настоящее время все ваши результаты используют один общий список. Не делай этого. Создайте отдельный список для каждого студента. В любом случае, предполагая, что идентификатор студента#одинаков для всех объектов, представляющих одного конкретного студента, вы можете сгруппировать все эти объекты по идентификатору, а затем обработать каждую группу для создания списка курсов.

2. Да, пробовал так, спасибо.

Ответ №1:

Пример Ответа:

 public class Student {
    private int id;
    private String name;
    private String email;
    private String course;

    public Student( int id, String name,String email, String course) {
        this.name = name;
        this.id = id;
        this.email = email;
        this.course = course;
    }

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id;
    }



    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public String toString() {
        return "Student{"  
                "name='"   name   '''  
                ", id="   id  
                ", email='"   email   '''  
                ", course='"   course   '''  
                '}';
    }


public class StudentModel {
    private int id;
    private String name;
    private String email;
    private Set<String> course;

    public StudentModel(int id) {
        this.id = id;
    }

    public StudentModel(int id, String name, String email) {
        this.name = name;
        this.id = id;
        this.email = email;
    }

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Set<String> getCourse() {
        return course;
    }

    public void setCourse(Set<String> course) {
        this.course = course;
    }

    public void addCourse(String course){
        if(!Objects.nonNull(this.course)){
            this.course = new HashSet<>();
        }
        this.course.add(course);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        StudentModel that = (StudentModel) o;
        return id == that.id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public String toString() {
        return "StudentModel{"  
                "name='"   name   '''  
                ", id="   id  
                ", email='"   email   '''  
                ", course="   course  
                '}';
    }
}


public class Main {

    public static void main(String[] args) {

        //This list will store the student objects which are retrieving from the database
        List<Student> studentsList = new ArrayList<>();

        //Mock values for database values
        studentsList.add(new Student(1, "Tom", "tom@email.com", "JAVA"));
        studentsList.add(new Student(1, "Tom", "tom@email.com", "DSA"));
        studentsList.add(new Student(2, "JERRY", "jerry@email.com", "C#"));

        //This list will store the student Model Objects
        List<StudentModel> studentsModelList = new ArrayList<>();

        studentsList.stream().forEach(student -> {
                    StudentModel tempStudentModel = new StudentModel(student.getId(), student.getName(), student.getEmail());
                    tempStudentModel.addCourse(student.getCourse());
                    boolean contains = false;
                    for (StudentModel temp : studentsModelList) {
                        if (temp.equals(tempStudentModel)) {
                            contains = true;
                            temp.addCourse(student.getCourse());
                        }
                    }
                    if (!contains) {
                        studentsModelList.add(tempStudentModel);
                    }

                }
        );

        System.out.println(studentsModelList);

    }

}
 

Выход:

 [StudentModel{name='Tom', id=1, email='tom@email.com', course=[JAVA, DSA]}, StudentModel{name='JERRY', id=2, email='jerry@email.com', course=[C#]}]