如何根据 Java 中给定的一组比较器对作为字符串的树图键进行排序

How to sort a treemap key that is a String according to a given set of comparator in Java

我有一个代码片段,它是一个树状图,其中键是星期几(星期一、星期二等),并且由于树状图会自动对键进行排序,因此它只会根据字母的值对其进行排序没有按照星期几排序

已经排序的地图的一些示例如下:

"Friday"
"Thursday"
"Tuesday"
"Wednesday"

impl服务中的代码如下:

@Override
    public ResponseDTO findAllTransactionByUserID(String userId){
        ResponseDTO responseDTO = new ResponseDTO();

        Map<String, Collection<UserHistoryDto>> map = new TreeMap<>();
        List<Transaction> transactions = couponTransactionRepository.findTransactionByUserId(userId);
        User user = userRepository.getOne(userId); //set the object based on ID

        Integer date;
        String day = "";
        responseDTO.setUserPoint(user.getUser_point()); //Get user-point

        for (Transaction trx : transactions) {

            //get the value of days as a map key

            date = trx.getTrans_time().getDayOfWeek().getValue();
            day = trx.getTrans_time().getDayOfWeek().name();
            Collection<UserHistoryDto> col = map.getOrDefault(day, new ArrayList<>());
            col.add(collect(trx));
            map.put(day, col);
        }


        responseDTO.setHistories(map)


        return responseDTO;
    }

"findAllTransactionByUserID"会做查询已经按照时间排序

出来的json是:

 {
    "userPoint": 22735,
    "histories": {
        "FRIDAY": [
            {
                "transactionId": "CPT01552",
                "date": 10,
                "day": "FRIDAY",
                "titleName": "Thanos super coupon",
                "pointAffected": 420,
                "transType": "Coupon",
                "month": "MAY"
            }
        ],
        "THURSDAY": [
            {
                "transactionId": "CPT01504",
                "date": 9,
                "day": "THURSDAY",
                "titleName": "Thanos super coupon",
                "pointAffected": 420,
                "transType": "Coupon",
                "month": "MAY"
            },
            {
                "transactionId": "CPT01404",
                "date": 9,
                "day": "THURSDAY",
                "titleName": "Sea Shanties",
                "pointAffected": 475,
                "transType": "Coupon",
                "month": "MAY"
            }
        ],
        "TUESDAY": [
            {
                "transactionId": "CPT01053",
                "date": 7,
                "day": "TUESDAY",
                "titleName": "Thanos super coupon",
                "pointAffected": 420,
                "transType": "Coupon",
                "month": "MAY"
            },
            {
                "transactionId": "CPT00952",
                "date": 7,
                "day": "TUESDAY",
                "titleName": "Sea Shanties",
                "pointAffected": 475,
                "transType": "Coupon",
                "month": "MAY"
            }
        ],
        "WEDNESDAY": [
            {
                "transactionId": "CPT01154",
                "date": 8,
                "day": "WEDNESDAY",
                "titleName": "Sea Shanties",
                "pointAffected": 475,
                "transType": "Coupon",
                "month": "MAY"
            {
                "transactionId": "CPT01102",
                "date": 8,
                "day": "WEDNESDAY",
                "titleName": "Thanos super coupon",
                "pointAffected": 420,
                "transType": "Coupon",
                "month": "MAY"
            }
        ]
    }
}

我希望星期三在星期二上方的 JSON 地图。 像这样:

"Friday"
"Thursday"
"Wednesday"
"Tuesday"

因为比较日期的字母表是行不通的,我试图找到一种方法来制作一个比较器,我可以比较日期的 value/order 以便它可以用作比较器

i.e : Monday - 1
Tuesday - 2

也许我们可以使用代码片段中的变量 "Date" 作为在比较器中分配每个键值的方法(或者手动分配,如果 taht 有效)但是我不知道如何加入比较器两种不同的数据类型

我对 java 和 spring 引导相对较新,这是我第一次在堆栈溢出中询问,我使用 java 8 并且不太了解 lambda 表达式.. .所以任何批评和帮助都非常有帮助谢谢!

如果您将 Map 更改为 Map<Integer, Collection<UserHistoryDto>> 并将 map.put(day, col) 更改为 map.put(date, col),您将获得所需的排序(假设星期一的数值最低).

如果必须保留当前的Map结构,可以将Comparator<String>传递给TreeMap的构造函数。 Comparatorcompare() 方法必须将每个 String 值映射到相应的数值并比较这些值(例如,"Monday" 将映射到 1,"Tuesday" 到 2,依此类推...)。

这是创建 Comparator 的一种方法。它需要首先创建一个 Map 将天 String 映射到整数值。

Map<String,Integer> dayValues = new HashMap<>();
dayValues.put("Monday",1);
...
dayValues.put("Sunday",7);
Comparator<String> cmpDays = Comparator.comparing(dayValues::get);
...
Map<String, Collection<UserHistoryDto>> map = new TreeMap<>(cmpDays);