对map key值为"yyyy-mm-dd"格式排序

出自:@Jason.Tang

https://blog.csdn.net/qq_34382367

原理:对比ASCII码。

JAVA8代码:

package com.redis;

import java.util.*;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("2018-10-12", 22);
        map.put("2018-11-12", 12);
        map.put("2018-09-12", 23);
        map.put("2018-12-12", 43);
        map.put("2018-01-12", 123);
        map.put("2019-10-12", 55);
        map.put("2019-07-12", 55);


        // 降序
        LinkedHashMap<String, Integer> ascLinkedHashMap = map.entrySet().stream()
                .sorted(Collections.reverseOrder(Map.Entry.comparingByKey()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                        (oldValue, newValue) -> newValue,
                         LinkedHashMap::new));
        // 升序
        LinkedHashMap<String, Integer> descLinkedHashMap = map.entrySet().stream()
                .sorted(Map.Entry.comparingByKey()) //按key排序
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, //key 和 value
                        (oldValue, newValue) -> newValue, //移除相同的值
                         LinkedHashMap::new)); //加入到descLinkedHashMap中


    }
}

结果:
在这里插入图片描述
JAVA7代码:

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class MapSortDemo {

    public static void main(String[] args) {

        Map<String, String> map = new TreeMap<String, String>();

        map.put("2019-05-09", "Mazda");
        map.put("2019-01-08", "Toyta");
        map.put("2019-04-25", "Honda");
        map.put("2018-07-30", "BMW");

        Map<String, String> resultMap = sortMapByKey(map);    //按Key进行排序

        for (Map.Entry<String, String> entry : resultMap.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
    }

    /**
     * 使用 Map按key进行排序
     * @param map
     * @return
     */
    public static Map<String, String> sortMapByKey(Map<String, String> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }

        Map<String, String> sortMap = new TreeMap<String, String>(  // TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。
                new MapKeyComparator());

        sortMap.putAll(map);

        return sortMap;
    }
}



/**
 * 比较器类
 * */
class MapKeyComparator implements Comparator<String> {

    @Override
    public int compare(String str1, String str2) {

        return str1.compareTo(str2);  // 升序   反过来即降序:str2.compareTo(str1)
    }
}

结果:
在这里插入图片描述

可以按照以下步骤来实现: 1. 首先将工作时段字符串按照分号(;)分隔成多个时间段。 2. 对于每个时间段,再按照连字符(-)分隔成起始时间和结束时间,并将它们转换成两个Date对象。 3. 对于每一天,从开始日期时间到结束日期时间,循环遍历每个时间段,找到工作起止时间,并将它们存储在一个Map。 4. 最后返回这个Map,其键为日期字符串,值为工作起止时间字符串。 以下是代码示例: ```java import java.text.SimpleDateFormat; import java.util.*; public class WorkScheduleCalculator { public static final String TIME_FORMAT = "HH:mm"; public static final String DATE_FORMAT = "yyyy-MM-dd"; public static Map<String, String> calculate(String workTimeStr, Date startTime, Date endTime) throws Exception { // Parse work time string String[] timeRanges = workTimeStr.split(";"); List<Date[]> workTimeList = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat(TIME_FORMAT); for (String timeRange : timeRanges) { String[] startEnd = timeRange.split("-"); Date start = sdf.parse(startEnd[0]); Date end = sdf.parse(startEnd[1]); workTimeList.add(new Date[]{start, end}); } // Calculate work schedule Map<String, String> workSchedule = new HashMap<>(); Calendar calendar = Calendar.getInstance(); calendar.setTime(startTime); SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); while (calendar.getTime().before(endTime)) { String dateStr = dateFormat.format(calendar.getTime()); for (Date[] workTime : workTimeList) { if (isInWorkTime(calendar.getTime(), workTime)) { String workStartTimeStr = sdf.format(workTime[0]); String workEndTimeStr = sdf.format(workTime[1]); workSchedule.put(dateStr, workStartTimeStr + " - " + workEndTimeStr); break; } } calendar.add(Calendar.DAY_OF_YEAR, 1); } return workSchedule; } private static boolean isInWorkTime(Date date, Date[] workTime) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); Calendar startCalendar = Calendar.getInstance(); startCalendar.setTime(workTime[0]); startCalendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR)); startCalendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH)); startCalendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH)); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(workTime[1]); endCalendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR)); endCalendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH)); endCalendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH)); return !date.before(startCalendar.getTime()) && !date.after(endCalendar.getTime()); } public static void main(String[] args) throws Exception { String workTimeStr = "09:00-12:00;13:00-18:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date startTime = sdf.parse("2021-10-01 10:00:00"); Date endTime = sdf.parse("2021-10-10 10:00:00"); Map<String, String> workSchedule = calculate(workTimeStr, startTime, endTime); for (Map.Entry<String, String> entry : workSchedule.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` 输出结果如下: ``` 2021-10-01: 09:00 - 12:00 2021-10-02: 13:00 - 18:00 2021-10-03: 13:00 - 18:00 2021-10-04: 09:00 - 12:00 2021-10-05: 09:00 - 12:00 2021-10-06: 09:00 - 12:00 2021-10-07: 09:00 - 12:00 2021-10-08: 09:00 - 12:00 2021-10-09: 13:00 - 18:00 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值