Как преобразовать изменяемую карту с определенными данными в список массивов?

#kotlin

#kotlin

Вопрос:

У меня есть изменяемая карта с ключом дней недели и значениями временного диапазона

 items: MutableMap<String, MutableList<Period>>
Period(start, end)
For example: monday: [Period = {start: "11:00", end: "12:12"}, Period =  {start: "15:00", end: "16:12"}], tuesday: [] and etc
  

Мне нужно преобразовать эту карту в список массивов следующим образом:

 [(Period = {start: "11:00", end: "12:12"}, [monday, tuesday, friday]), (Period={start: "15:00", end: "16:12"}, [sunday, monday, thursday]) etc]

  
 
 have a map like "monday": [
                    {"end": "13:29", "start": "00:30" }
                ],
                "friday": [],
                "saturday": [],
                "wednesday": [
                    {"end": "04:29","start": "02:30"}
                ],
                "tuesday": [
                    {"end": "04:29","start": "02:30"},
                    { "end": "13:29", "start": "12:30"}
                ],
                "sunday": [],
                "thursday": [
                    {"end": "04:29","start": "02:30" },
                    { "end": "14:29","start": "05:30"}
                ]
need to transform to [(Period: {"end": "04:29","start": "02:30" }, [tuesday, wednesday, thursday]), (Period: { "end": "14:29","start": "05:30"}, [thursday]), (Period: {"end": "13:29", "start": "00:30" }, [monday, tuesday]) ]
  

в массив чего-то подобного
Кто-нибудь может помочь с этим, пожалуйста?

это метод того, как мне нужно преобразовать

 fun transformMap(items: MutableMap<String, MutableList<Period>>): ArrayList<Pair<Period, List<String>>> {

}




  

Комментарии:

1. Это не Kotlin.

2. Не могли бы вы, пожалуйста, добавить пример карты со значениями и точным желаемым результатом вместе с вашими попытками решить эту проблему?

3. @deHaar добавил пример карты, и каким образом мне нужно ее преобразовать, пожалуйста, проверьте

4. У вас есть объекты JSON, но нет Period объекта, верно? Можете ли вы показать нам, как вы преобразуете / анализируете его в Kotlin?

5. @deHaar добавил метод, у меня есть карта, которая должна возвращать список массивов, каким-то образом преобразуя данные

Ответ №1:

Попробуйте это:

 fun transformMap(items: MutableMap<String, MutableList<Period>>): ArrayList<Pair<Period, List<String>>> {
    //for each day and its list of periods, create a list of period-day pairs
    //and join the individual lists into a single list
    val periodAndDayPairs = items.flatMap {
        val day = it.key
        val periods = it.value
        periods.map { period -> Pair(period, day) }
    }
    //create a map where key is the period and value is a list of period-day pairs with the same period
    val periodToPeriodAndDayPairs = periodAndDayPairs.groupBy { it.first }
    //modify values in that map - extract only the day from the period-day pair
    val periodToDays = periodToPeriodAndDayPairs.mapValues {
        it.value.map { it.second }
    }
    //finally, convert each map entry into a period-days pair and store it into an ArrayList to match requested function signature
    return periodToDays.mapTo(ArrayList(), { Pair(it.key, it.value)})
}
  

Отказ от ответственности: Код намеренно подробный, чтобы его было легче понять.

Комментарии:

1. вы можете упростить items.flatMap { (days, periods) -> ... } и val periodToDays = periodAndDayPairs.groupBy({ it.first }, { it.second }) , также существует toPair() метод расширения для Map.Entry

2. это сработало так, как я хотел, большое спасибо @mcernak