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

问题描述 投票:0回答:2

我正在尝试将对象列表数据结构转换为Maps。

Map<String, Map<Integer, StudentModel>>

字符串是运动变量

整数是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));

我的预期输出:

{
 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)
     }
 }
java arraylist linkedhashmap
2个回答
0
投票

问题是您仅对studentMap的每个条目使用inputMap的单个实例/内存,因此您会针对每个'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);
    }
 }

0
投票

您需要为每种运动创建一个新地图:

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)
        Map<Integer, StudentModel> studentMap = inputMap.computeIfAbsent(student.getSports, k -> new LinkedHashMap<>()); // create a new map and insert it into the map if it's not already there
        studentMap.put(studentModel.getOrderId, studentModel);
    }
 }

与问题无关,但应使用getter方法访问字段,例如而不是student.getSports,您应该使用sports方法使用私有的getSports()字段。

© www.soinside.com 2019 - 2024. All rights reserved.