I have two ArrayLists of ClassRoom object and below shows the ClassRoom class :
public class ClassRoom {
private String className; // className is unique here
private List<Student> students = new ArrayList<>();
public ClassRoom(String className, List<Student> students) {
this.className = className;
this.students = students;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
String ss = "[";
for (int i = 0; i < students.size(); i++) {
ss += "{name:'" + students.get(i).getName() + "',age:" + students.get(i).getAge() + "}";
ss += (i == (students.size() - 1)) ? "" : ",";
}
ss += "]";
return "{'" + className + "':" + ss + "}";
}
}
ClassRoom class contains className String property and List of Student object which describes below:
public class Student {
private String name; // name is unique here
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
I have created my two lists of ClassRoom object like below :
List<ClassRoom> list1 = new ArrayList<>();
list1.add(new ClassRoom("A", Arrays.asList(new Student("Sam", 20), new Student("Peter", 40), new Student("Aaron", 15))));
list1.add(new ClassRoom("B", Arrays.asList(new Student("Ronnie", 33), new Student("Daniel", 41), new Student("Gabe", 35))));
list1.add(new ClassRoom("C", Arrays.asList(new Student("Fabian", 42), new Student("Edgar", 33))));
list1.add(new ClassRoom("D", Arrays.asList(new Student("Peter", 39), new Student("Calvin", 45))));
List<ClassRoom> list2 = new ArrayList<>();
list2.add(new ClassRoom("A", Arrays.asList(new Student("Sam", 26), new Student("Aaron", 18))));
list2.add(new ClassRoom("B", Arrays.asList(new Student("Daniel", 38), new Student("Eddy", 29))));
list2.add(new ClassRoom("C", Arrays.asList(new Student("Fabian", 42), new Student("Edgar", 33))));
So my final task is to create a new List of ClassRoom object like below :
List<ClassRoom> mergedList = merge(list1, list2);
for (ClassRoom classRoom : mergedList) {
System.out.println(classRoom.toString());
/* Expected output here
{'A':[{name:'Sam',age:26},{name:'Peter',age:40},{name:'Aaron',age:18}]}
{'B':[{name:'Ronnie',age:33},{name:'Daniel',age:38},{name:'Gabe',age:35},{name:'Eddy',age:29}]}
{'C':[{name:'Fabian',age:42},{name:'Edgar',age:33}]}
{'D':[{name:'Peter',age:39},{name:'Calvin',age:45}]}
*/
}
And below explains my merge method:
public static List<ClassRoom> merge(List<ClassRoom> listA, List<ClassRoom> listB) {
ArrayList<ClassRoom> collect = Stream.of(listA, listB).collect(ArrayList<ClassRoom>::new, (item1, item2) -> {
item2.forEach((c2) -> {
item1.forEach((c1) -> {
if (c2.getClassName().equalsIgnoreCase(c1.getClassName())) {
// Student list update goes here
} else {
item1.add(c2);
}
});
});
}, (item1, item2) -> {
});
return collect;
}
Problem I am having so far is resulting an empty list after the merge method call. Any suggestions would be appreciated.
forEachloops incollect