我正在尝试将List of objects数据结构转换为Map of Map。
Map<String, Map<Integer, StudentModel>>
字符串是运动变量
Integer为orderId。
我的逻辑返回了低于value的值,如下所示。我正在寻找更好的方法来实现这一点。
@Data
@Builder
public class Student {
private String name;
private int rollno;
private int studentage;
private String sports;
private int orderId;
}
@Data
@Builder
public class StudentModel {
private String name;
private int rollno;
private int studentage;
private String sports;
}
创建相同的数据并添加到列表中:
arraylist.add(new Student(223, "Zebra", 26, "cricket", 1));
arraylist.add(new Student(245, "Rahul", 24, "cricket", 2));
arraylist.add(new Student(209, "Ajeet", 32, "cricket", 3));
arraylist.add(new Student(140, "Abhay", 28, "basketball", 4));
arraylist.add(new Student(270, "Ranger", 29, "basketball", 5));
arraylist.add(new Student(250, "Ranger1", 39, "basketball",6));
Collections.sort(arraylist, Comparator.comparing(Student::getOrderId));
我的预期输出:
{
cricket={
1=Student(sports=cricket, rollno=223, name=Zebra, studentage=26),
2=Student(sports=cricket, rollno=245, name=Rahul, studentage=24),
3=Student(sports=cricket, rollno=209, name=Ajeet, studentage=32)
},
basketball={
4=Student(sports=basketball, rollno=140, name=Abhay, studentage=28),
5=Student(sports=basketball, rollno=270, name=Ranger, studentage=29),
6=Student(sports=basketball, rollno=250, name=Ranger1, studentage=39)
}
}
逻辑编写:
public Map<String, Map<Integer, StudentModel>> studentModel() {
Map<Integer, StudentModel> studentMap = new LinkedHashMap<>();
Map<String, Map<Integer, StudentModel>> inputMap = new LinkedHashMap<>();
for (Student student : arraylist) {
StudentModel studentModel = StudentModel.builder().name(student.getName)
.rollno(student.getRollno)
.studentage(student.getStudentage)
.sports(student.getSports)
studentMap.put(studentModel.getOrderId, studentModel);
inputMap.put(student.getSports, studentMap);
}
}
上面的逻辑返回下面的结果:
{
cricket={
1=Student(sports=cricket, rollno=223, name=Zebra, studentage=26),
2=Student(sports=cricket, rollno=245, name=Rahul, studentage=24),
3=Student(sports=cricket, rollno=209, name=Ajeet, studentage=32),
4=Student(sports=basketball, rollno=140, name=Abhay, studentage=28),
5=Student(sports=basketball, rollno=270, name=Ranger, studentage=29),
6=Student(sports=basketball, rollno=250, name=Ranger1, studentage=39)
},
basketball={
1=Student(sports=cricket, rollno=223, name=Zebra, studentage=26),
2=Student(sports=cricket, rollno=245, name=Rahul, studentage=24),
3=Student(sports=cricket, rollno=209, name=Ajeet, studentage=32),
4=Student(sports=basketball, rollno=140, name=Abhay, studentage=28),
5=Student(sports=basketball, rollno=270, name=Ranger, studentage=29),
6=Student(sports=basketball, rollno=250, name=Ranger1, studentage=39)
}
}
发布于 2020-06-03 12:29:04
问题是,对于inputMap
的每个条目,您只使用了一个studentMap
实例/内存,因此您可以看到每个“sport”键对应的所有6个学生条目,因为这些inputMap
条目值中的每一个都指向相同的studentMap
参考值,因此可以观察到任何运动类型键所做的更改。
你想要做的是为每种类型的“运动”创建新的studentMap
内存,所以。您可以尝试这样做:
public Map<String, Map<Integer, StudentModel>> studentModel() {
Map<Integer, StudentModel> studentMap;
Map<String, Map<Integer, StudentModel>> inputMap = new LinkedHashMap<>();
for (Student student : arraylist) {
StudentModel studentModel = StudentModel.builder().name(student.getName)
.rollno(student.getRollno)
.studentage(student.getStudentage)
.sports(student.getSports)
// This would create new memory for each type of sport
studentMap = inputMap.getOrDefault(student.getSports, new LinkedHashMap<Integer, StudentModel>());
studentMap.put(studentModel.getOrderId, studentModel);
inputMap.put(student.getSports, studentMap);
}
}
发布于 2020-06-03 12:37:00
你需要为每项运动创建一个新的地图:
public Map<String, Map<Integer, StudentModel>> studentModel() {
Map<String, Map<Integer, StudentModel>> inputMap = new LinkedHashMap<>();
for (Student student : arraylist) {
StudentModel studentModel = StudentModel.builder().name(student.getName)
.rollno(student.getRollno)
.studentage(student.getStudentage)
.sports(student.getSports)
// create a new map and insert it into the outer map if it's not already there
Map<Integer, StudentModel> studentMap = inputMap.computeIfAbsent(student.getSports, k -> new LinkedHashMap<>());
studentMap.put(studentModel.getOrderId, studentModel);
}
}
与这个问题无关,但是字段应该通过getter方法访问,例如,你应该有一个带有getSports()
方法的私有sports
字段,而不是student.getSports
。
发布于 2020-06-03 12:40:15
groupingBy方法完全符合您的需要。您希望根据学生的运动对原始数组列表中的学生进行分组:
Map<String, List<Student>> inputMap = arraylist.stream().collect(Collectors.groupingBy(Student::getSports));
https://stackoverflow.com/questions/62172416
复制