天天看点

springboot将list分组后塞到map转成json返回(基于jeesite框架、动态声明list)

在上周的开发中,遇到这么一个需求,如图:

springboot将list分组后塞到map转成json返回(基于jeesite框架、动态声明list)

有这样一个导航框显示子部门,这个子部门比较多,目前27个,根据《 》翻页,之前的做法是将接口分页,每点一次《或者》就请求一次接口重新获取分页的数据,但是我觉得一开始我就已经返回了所有数据,没必要频繁请求接口,所以我就进行了优化,大概的思路:将返回的的list<子部门>分组,每5个一组,放到map中,再将map转成json返回前端,那么前端就根据我分好组,默认显示第一组,点击下一页就显示第二组,再下一页就第三组、以此类推

springboot将list分组后塞到map转成json返回(基于jeesite框架、动态声明list)
//初始化子部门的数据,集团默认显示的是企业下的所有数据
		Office office = new Office();
		office.setParentCode("GAC200");
		List<Office> soList = officeService.findList(office);
		//定义一个map将所有数据分组,每组5个返回大屏页面,进行一个分页的操作
		Map<String, Object> soMap = new HashMap<String, Object>();
		//5个一组,num记录一共有多少组
		int num;
		if(soList.size()%5 != 0) {
			num= soList.size()/5+1;
		}else {
			num = soList.size()/5;
		}
		//将多少组也传到页面
		soMap.put("count", num);
		
		List<Office> temp = officeService.findList(office);
		//定义key主要是map的key,第一组传office1第二组传office2以此类推
		int key = 1;
		for(int i=1;i<soList.size()+1;i++) {
			temp.add(soList.get(i-1));
			if( i%5 == 0) {
				//够五个了也就是够一组了将改组数据放到map中
				soMap.put(String.valueOf("office"+key), temp);
				key++;
				temp.clear();
			}
		}
           

在这个过程我遇到了一些问题,一开始我的代码是这么写的,但是在调试过程中就发现map永远只有一条数据,发现list是引用类型,我每次都是对temp进行操作,也就是永远只有一个lsit!如果子部门有27个,27%5!=0;那么length=27/5+1=6组,那么我就一共要分为6组,也就是我需要6个list,这只是我的分析,我不可能直接就定义6个list,对不对,假设哪天这个企业的子部门多了少了不再是6组了,你的代码就不再适应了!这不是我的风格,虽然能应付开发,蒙混过关,但是人要有责任心,自己也要追求进步。

这时候我就考虑到了一个问题,我能不能不返回list,list是集合,又不能再定义成数组,那有没有clone()方法,我无法再复制一个lsit,但是开辟的是两个地址空间,这时候我考虑到怎么才能动态的初始化,就是我怎么能在代码运行的时候再确定我要多少组,在我所有学习的过程中只有数组是可以动态初始化的,list不能是数组,那什么既能定义成为数组又可以保存list,我想到了对象,对象的成员属性里面是我的list <子部门>,这样不就侧面的、投机取巧的解决了动态声明list,代码如下:

定义一个对象,主要用于数据封装

package com.jeesite.modules.kwm.entity;

import java.util.ArrayList;
import java.util.List;

import com.jeesite.modules.sys.entity.Office;

/**
 * 该类主要是封装分组后端的子部门数据传到大屏页面(每5个一组)
 * @author liaomengdan
 *
 */
public class KwmSonOffice {
	
	List<Office> officeList;

	public KwmSonOffice() {
		super();
		officeList = new ArrayList<Office>();
	}
	
	public KwmSonOffice(List<Office> officeList) {
		super();
		this.officeList = officeList;
	}

	public List<Office> getOfficeList() {
		return officeList;
	}

	public void setOfficeList(List<Office> officeList) {
		this.officeList = officeList;
	}
	
}
           

接口层代码:

//初始化子部门的数据,集团默认显示的是企业下的所有数据
		Office office = new Office();
		office.setParentCode("GAC200");
		List<Office> soList = officeService.findList(office);
		//定义一个map将所有数据分组,每组5个返回大屏页面,进行一个分页的操作
		Map<String, Object> soMap = new HashMap<String, Object>();
		//5个一组,num记录一共有多少组
		int num;
		if(soList.size()%5 != 0) {
			num= soList.size()/5+1;
		}else {
			num = soList.size()/5;
		}
		//将多少组也传到页面
		soMap.put("count", num);
		//动态声明KwmSonOffice对象数组并初始化,主要用于传递数据到前端
		KwmSonOffice[] sonOffice =new KwmSonOffice[num];
		for(int i = 0 ; i < num ; i++) {
			sonOffice[i] = new KwmSonOffice();
		}
		//定义key主要是map的key,第一组传1第二组传2以此类推
		int key = 0;
		//将数组进行分组
		for(int i=1;i<soList.size()+1;i++) {
			sonOffice[key].getOfficeList().add(soList.get(i-1));
			if( i%5 == 0) {
				//够五个了也就是够一组了将改组数据放到map中
				soMap.put(String.valueOf("office"+(key+1)), sonOffice[key].getOfficeList());
				key++;
			}
		}
		if(soList.size()%5 != 0) {
			soMap.put(String.valueOf("office"+(key+1)), sonOffice[key].getOfficeList());
		}
		//将map转成json传到页面上
		ObjectMapper objectMapper = new ObjectMapper();
		String mapString = null;
		try {
			mapString = objectMapper.writeValueAsString(soMap);
		} catch (Exception e) {
			e.printStackTrace();
		}
		model.addAttribute("soList", mapString);
           

希望对你们有帮助,或者有更好的解决办法请告诉我,前端的代码有空我再贴