繁体   English   中英

Java - 将对象列表转换为 map 数据结构的 map

[英]Java - Convert list of objects to map of map data structure

我正在尝试将对象数据结构列表转换为地图的 Map。

Map<String, Map<Integer, StudentModel>>

字符串是运动变量

Integer 是 orderId。

我的逻辑返回值低于如下所示。 我正在寻找更好的方法来实现这一目标。

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

我预期的 output:

{
 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)
     }
 }

问题是您对inputMap的每个条目仅使用studentMap的单个实例/内存,因此您会看到针对每个“运动”键的所有 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);
    }
 }

您需要为每项运动创建一个新的 map:

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

groupingBy 方法完全符合您的需要。 您想根据他们的运动对原始 arraylist 中的学生进行分组:

Map<String, List<Student>> inputMap = arraylist.stream().collect(Collectors.groupingBy(Student::getSports));

发生这种情况是因为您在两个类别中都使用了相同的学生 map 实例。

这是你的代码

 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);//logical error here inputMap.put(student.getSports, studentMap);//error here } }

使用下面的代码以获得所需的结果

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) { if (inputMap.get(student.getSports())==null){ studentMap = new LinkedHashMap<>(); }else{ studentMap = inputMap.get(student.getSports()); } StudentModel studentModel = StudentModel.builder().name(student.getName).rollno(student.getRollno).studentage(student.getStudentage).sports(student.getSports) studentMap.put(studentModel.getOrderId, studentModel);//error here inputMap.put(student.getSports, studentMap);//error here } }`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM