如下列例子中将学生按教室分组,则list中按教室顺序进行分批添加。先添加完教室一再添加教室二,如果穿插添加,那么结果就无法按相同教室进行分组。
废话不多说直接上代码
public class mapTest {
public static void main(String[] args) {
Map<String,Object> roomMap=null,studentMap=null;
List< Map<String,Object>> returnList=new ArrayList<>();
List< Map<String,Object>> studentList=null;
Student s1=new Student(),s2=new Student(),s3=new Student();
s1.setAge(12);
s1.setName("小一");
s1.setClassName("一教室");
s2.setAge(13);
s2.setName("小二");
s2.setClassName("一教室");
s3.setAge(14);
s3.setName("小三");
s3.setClassName("二教室");
List<Student> list=new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
String preClassName="";
for(Student e:list){
String className=e.getClassName();
String name=e.getName();
int age=e.getAge();
//根据教室分配学生
// 判断本次和上次教室名是否相同,若不同(或为空,首次进入)则进入,roomMap新增教室数据,若相同,则不进入
if(!className.equals(preClassName)||isEmpty(preClassName)){
//判断roomMap是否为空,若不为空,则新增roomMap,装出最后一次以外的roommap
if(roomMap!=null){
roomMap.put("student_list",studentList);
returnList.add(roomMap);
}
roomMap=new HashMap<>();
preClassName=className;
roomMap.put("className",className);
studentList=new ArrayList<>();
}
studentMap=new HashMap<>();
//不管教室map是否相同,每循环一次都会新增一个学生map,只是通过前面的教室map判断是否加入本次roomMap
studentMap.put("name",name);
studentMap.put("age",age);
studentList.add(studentMap);
}
//循环结束,装最后一次的roomMap
roomMap.put("student_list",studentList);
returnList.add(roomMap);
System.out.println(returnList);
}
public static boolean isEmpty(String str){
return (null == str) || (str.length() == 0);
}
}
class Student{
private String name;
private int age;
private String className;
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;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
输出结果为:[{className=一教室, student_list=[{name=小一, age=12}, {name=小二, age=13}]}, {className=二教室, student_list=[{name=小三, age=14}]}]