java统计指定年月下的每一天,并排序

需求:从数据库查出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}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值