#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