我想寫一個函式,可以合并一個地圖串列,其回傳值為:
我想寫一個函式,可以合并一個地圖串列。
- 不包含重復的鍵/值對
- 不包含重復的鍵/值對 。
- 按鍵分組 - 例如,當同一鍵有多個條目時,該鍵的所有值被合并為 List 。
- 所有其他值都是字串 。
我已經走到了這一步:
我已經走到了這一步。
fun mergeMaps( maps: List<Map<String, *>>)。Map<String, *> {
val mergedMap =
maps.reduce { acc, map ->
(acc.asSequence() map.asSequence()).distinct().groupBy({ it.key }, { it.value })
}
return mergedMap. entries.fold(mutableMapOf<String, Any>() ) { acc, entry ->
val entryValue = entry.value as List<String>
val key = entry.key
val value = if (entryValue.size > 1) entryValue else entryValue.first()
if (acc.containsKey(key)) {
when (acc[key]) {
is String -> {
acc[key] = listOf(acc[key], value)
}
else -> {
acc[key] = (acc[key] as List< String>) value
}
}
} else acc[key] = value
acc
}
}
但是我正在努力讓這個函式處理現有的串列值。
val map1 = mapOf("foo"/span> to "bar"/span>, "test"到"test-value", "arrayTest"到listOf("foo", "bar")
val map2 = mapOf("biz" to "buz", "test" to "something-else", "arrayTest" to " baz")
val mergedMaps = mergeMaps(listOf(map1, map2) )
產生
{foo=bar, test=[test-value, something-else], arrayTest=[[foo, bar], baz], biz=buz}。
當我期望它是:
{foo=bar, test=[test-value, something-else], arrayTest=[foo, bar, baz], biz=buz}。
是否有更好的方法來做這個?我哪里做錯了?
uj5u.com熱心網友回復:
我認為一個更簡單的策略是首先將所有內容添加到一個帶有List值的Map中。我希望這將是更典型的最終目標,因為它可以在沒有轉換的情況下使用,但假設你有一個用例需要你描述的方式,你可以使用mapValues替換只有一個專案的串列。
fun mergeMaps( maps: List<Map<String, *>>): Map<String, *> {
return maps.fold(mutableMapOf<String, MutableList<Any?>>() ) { outMap, map ->
for ((key, value) in map) {
val outList = outMap.getOrPut(key, :: mutableListOf)
if (value is List<*>) outList.addAll(value) else outList.add(value
}
串列
}.mapValues { (_, value) -> if (value.size == 1) value.first() else value }
}
這也是一種寫法,值的型別可以是除List以外的任何東西(不僅僅是String)。
uj5u.com熱心網友回復:
fun merge( src: Map<String, Any>, dest: MutableMap<String, MutableList<String>) {
src.forEach { k, v ->
val newVal = dest.getOrPut(k) { mutableListOf<String>() }
if (v is List<*>) newVal.addAll(v as List<String>)
else newVal.add(v.toString() )
}
}
fun main(args: Array<String>) {
val map1 = mapOf("foo" to "bar" , "test" to "test-value" , "arrayTest"到listOf("foo", "bar")
val map2 = mapOf("biz" to "buz", "test" to "something-else", "arrayTest" to " baz")
val mergedMap = mutableMapOf<String, MutableList<String>>()
merge(map1, mergedMap)
合并(map2, mergedMap)
val map3 = mergedMap.mapValues {
if (it.value.size == 1) it.value.first() else it.value
}
print(map3)
}
{foo=bar, test=[test-value, something-else], arrayTest=[foo, bar, baz], biz=buz}
這做了你要求的事情,但沒有意義,因為它把Kotlin當成了Python。問題是在你合并所有地圖之前,你將不知道一個鍵出現了多少次,所以你必須進一步對合并后的地圖進行后處理。
你在評論中提到了轉換為JSON,如果你的合并地圖是String, List<String>型別,你仍然可以這么做。JSON規范中并沒有針對單元素串列的規定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/328857.html
標籤:
上一篇:迭代器的運算子號-Kotlin
