Как отсортировать ключ древовидной карты, который является строкой, в соответствии с заданным набором компаратора в Java - PullRequest
2 голосов
/ 13 мая 2019

У меня есть фрагмент кода, который представляет собой древовидную карту, где ключом является день недели (понедельник, вторник и т. Д.), И поскольку древовидная карта автоматически сортирует ключи, он будет сортировать его только по значению алфавитов, поэтому не сортируетв соответствии с порядком дня недели

некоторые примеры уже отсортированной карты выглядят следующим образом:

"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"

Поскольку сравнение алфавитов дней не сработает, я пытаюсь найти способ создать компаратор, где я мог бы сравнить значение / порядок дней, чтобы онможет использоваться в качестве компаратора

i.e : Monday - 1
Tuesday - 2

возможно, мы можем использовать переменную «Дата» в фрагменте кода в качестве способа присвоить значение каждой клавише (или назначить вручную, если таковая работает) в компараторе, ноЯ знаю, как объединить компаратор с двумя различными типами данных

Я относительно новичок в Java и Spring Boot, и я впервые спрашиваю здесь о переполнении стека, я использую Java 8 и мало что знаю о лямбда-выражениях... так что любая критика и помощь очень полезны, спасибо!

1 Ответ

1 голос
/ 13 мая 2019

Если вы измените Map на Map<Integer, Collection<UserHistoryDto>> и измените map.put(day, col) на map.put(date, col), вы получите желаемую сортировку (при условии, что в понедельник самое низкое числовое значение).

Если вам необходимо сохранить текущую структуру Map, вы можете передать Comparator<String> в конструктор TreeMap. Этот метод Comparator compare() должен сопоставить каждое значение String с соответствующим числовым значением и сравнить эти значения (например, «Понедельник» будет сопоставлен с 1, «Вторник» с 2 и т. Д.). ...).

Вот один из способов создания Comparator. Сначала необходимо создать Map, который отображает день String s в целочисленные значения.

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);
...