需求:从数据库查出List<Map<String,Object>>格式的数据。
比如:[{num=1, tm=05-04}, {num=1, tm=05-06},{num=1, tm=05-03}]
但是,需求是要查出指定的年月的所有天数,之前想从sql入手,无奈失败,从java入手
拼数据。
public static void main(String[] args) throws ParseException {
List<Map<String, Object>> list=new ArrayList<>();
Map<String,Object> mp1=new HashMap<>();
Map<String,Object> mp2=new HashMap<>();
Map<String,Object> mp3=new HashMap<>();
mp1.put("num", 10);
mp1.put("tm", "02-10");
mp2.put("num", 10);
mp2.put("tm", "02-18");
mp3.put("num", 10);
mp3.put("tm", "02-01");
list.add(mp1);
list.add(mp2);
list.add(mp3);
getData(2018,2,list);
}
/**
* 构造整个月的数据,数据库查不到默认为零,只要传入年和月以及数据就可以返回按升序排好的整个月的数据
*2018年5月30日
*smy
*@param year 指定年
*@param m 指定月
*@param mp 数据库得到的数据
*@return
*/
public static List<Map<String, Object>> getData(int year, int month, List<Map<String, Object>> mp) {
ArrayList<String> dayList = dayList( year, month);//指定月日期集合
if(mp.size()< getDaysByYearMonth(year,month)){
for(Map m:mp){
dayList.remove(m.get("tm"));//移除和mp(传入的参数)中重复的数据,剩下的就是不同的记录。
}
}
for(String str:dayList){//把两个集合融为一体
HashMap<String, Object> tempMap = new HashMap<>();
tempMap.put("num", "0");
tempMap.put("tm", str);
mp.add(tempMap);
tempMap=null;
}
return listSort(mp);//把融为一体的集合排序得到最终结果
}
/**
* 获取指定年月的天数集合[05-01,05-02,05-03,05-04......]
*2018年5月30日
*smy
*@param year
*@param month
*@return List集合的月日集合[05-01,05-02,05-03,05-04......]
*/
private static ArrayList<String> dayList(int year, int month) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);//设置年份,不设置年2月会有问题
cal.set(Calendar.MONTH, month-1);//设置月份
cal.set(Calendar.DAY_OF_MONTH, 1);// 从一号开始
ArrayList<String> arrayList = new ArrayList<>();
for (int i = 0; i < getDaysByYearMonth(year, month); i++, cal.add(Calendar.DATE, 1)) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String df = simpleDateFormat.format(cal.getTime());
String substring="";
if(df!=null){
substring = df.substring(5, 10);//截取月日比如05-03
}
arrayList.add(substring);
}
return arrayList;//返回指定月的天数集合
}
/**
* 获取year年的month月的天数
*2018年5月30日
*smy
*@param year 年份
*@param month 月份
*@return int类型的天数总数30
*/
private static int getDaysByYearMonth(int year, int month) {
Calendar a = Calendar.getInstance();
a.set(Calendar.YEAR, year); //设置年
a.set(Calendar.MONTH, month - 1); //设置月
a.set(Calendar.DATE, 1); //设置天
a.roll(Calendar.DATE, -1);
int maxDate = a.get(Calendar.DATE);
return maxDate; //总天数
}
/**
* 对List<Map<String, Object>>数据集进行升序排序
*2018年5月30日
*smy
*@param resultList
*@return 返回List<Map<String, Object>>数据集
*/
public static List<Map<String, Object>> listSort(List<Map<String, Object>> resultList) {
// resultList是需要排序的list,其内放的是Map
// 返回的结果集
Collections.sort(resultList, new Comparator<Map<String, Object>>() {
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
// o1,o2是list中的Map,可以在其内取得值,按其排序,此例为升序,s1和s2是排序字段值
Integer s1 = Integer.valueOf(((String) o1.get("tm")).replace("-", "")) ;
Integer s2 = Integer.valueOf(((String) o2.get("tm")).replace("-", "")) ;
if (s1 > s2) {
return 1;
} else {
return -1;
}
}
});
System.out.println(resultList);
return resultList;//返回排序的结果
}
//运行结果如下
[{num=10, tm=02-01}, {num=0, tm=02-02}, {num=0, tm=02-03}, {num=0, tm=02-04}, {num=0, tm=02-05}, {num=0, tm=02-06},
{num=0, tm=02-07}, {num=0, tm=02-08}, {num=0, tm=02-09}, {num=10, tm=02-10}, {num=0, tm=02-11}, {num=0, tm=02-12},
{num=0, tm=02-13}, {num=0, tm=02-14}, {num=0, tm=02-15}, {num=0, tm=02-16}, {num=0, tm=02-17}, {num=10, tm=02-18},
{num=0, tm=02-19}, {num=0, tm=02-20}, {num=0, tm=02-21}, {num=0, tm=02-22}, {num=0, tm=02-23}, {num=0, tm=02-24},
{num=0, tm=02-25}, {num=0, tm=02-26}, {num=0, tm=02-27}, {num=0, tm=02-28}]