我有兩個物體:Item 和 ItemWrapper。
- ItemWrapper 包括專案。
- ItemWrapper 可以有一個 ItemWrapper 父參考
為簡單起見,Item 是一個字串 "a", "b", ... ItemWrapper 僅包含這些專案 其他 ItemWrapper。他們也有自己的身份證。
所以基本上我有一個這樣的輸入串列:
| ID | 標題 | parent_id | 專案 |
|---|---|---|---|
| 1 | 包裝 #1 | 空值 | {a,b,c} |
| 2 | 包裝 #2 | 空值 | {x,y,z} |
| 3 | 包裝 #3 | 1 | {w,u} |
| 4 | 包裝 #4 | 1 | 空值 |
我需要撰寫一個高效的 kotlin 函式來接受這個輸入并回傳:
{
"Wrapper #1" : {
childrenWrappers: [
"Wrapper #3" : {
childrenWrappers: null,
items: w,u
},
"Wrapper #4" : {
childrenWrappers: null,
items: null
}
],
items: a,b,c
},
"Wrapper #2" : {
childrenWrappers: null,
items: x,y,z
}
}
該解決方案可以使用任何資料結構或類,它不必是 JSON 表示形式(盡管我會將其編碼為 json 以進行 API 傳輸)
uj5u.com熱心網友回復:
假設您的資料結構如下所示:
data class ItemWrapper(
val id: Int,
val title: String,
val items: List<String>,
val parentId: Int? = null,
)
您預期的結果資料結構如下所示:
data class ItemWrapperNode(
val items: List<String>,
val childrenWrappers: Map<String, ItemWrapperNode>,
)
我們可以撰寫轉換函式:
fun List<ItemWrapper>.toTree(): Map<String, ItemWrapperNode> =
groupBy { it.parentId }.childrenOf(null)
fun Map<Int?,List<ItemWrapper>>.childrenOf(parentId: Int?): Map<String, ItemWrapperNode> =
get(parentId)
?.map { it.title to ItemWrapperNode(it.items, childrenOf(it.id)) }
?.toMap() ?: emptyMap()
然后對于 s 的串列itemWrappers,ItemWrapper您可以呼叫itemWrappers.toTree()以獲得所需的輸出。
如果你想限制遞回的最大深度,我們可以通過引入一個附加引數來擴展這些函式,該引數maxDepth在每個遞回步驟中遞減:
fun List<ItemWrapper>.toTree(maxDepth: Int): Map<String, ItemWrapperNode> =
groupBy { it.parentId }.childrenOf(null, maxDepth)
fun Map<Int?,List<ItemWrapper>>.childrenOf(parentId: Int?, maxDepth: Int): Map<String, ItemWrapperNode> =
if(maxDepth <= 0) emptyMap()
else get(parentId)
?.map { it.title to ItemWrapperNode(it.items, childrenOf(it.id, maxDepth - 1)) }
?.toMap() ?: emptyMap()
然后,我們可以例如寫:
val wrappers = listOf(
ItemWrapper(1, "ItemWrapper #1", listOf("a")),
ItemWrapper(2, "ItemWrapper #2", listOf("b")),
ItemWrapper(3, "ItemWrapper #3", listOf("c"), 1),
ItemWrapper(4, "ItemWrapper #4", listOf("d"), 1),
)
println(wrappers.toTree(0))
這會產生一個空地圖作為結果。僅使用s #1 和 #2 會回傳maxDepth。使用of或更高,我們獲得所有s。1ItemWrappermaxDepth2ItemWrapper
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/440845.html
標籤:科特林
