Kotlin:如何将一个字段从列表映射到一个新列表并对其进行分组



我有两个列表

list1 = [ { city: 'Los Angeles', population: '4 million ' } ... ]
list2 = [ { nameOfCity: 'New York', language: 'English' }, {nameOfCity: 'Berlin', language: 'German' ]

现在我需要创建一个新的列表,并根据城市名称过滤这两个列表,然后用相同的语言对其进行分组

newClass(val nameOfCities: List<String>, language: String)

因此,我需要检查list2的城市名称是否在列表2中(list2.filter{it.nameOfCity!=list1.city}(,并将所有名称存储在按语言分组的nameOfCities列表中

所以最终结果应该是这样的:

[
{ nameOfCities: [New York, Chicago]
language: Engilsh
},
{ nameOfCities: [Berlin]
language: German
}
]

因此,我得到了一个新的列表,列出了列表1中不存在的所有城市,并按相同的语言分组。

这是我得到的最接近的:

for (item in list1) {
reducedList = (list2.filter { it.nameOfCity != item.city }.map { newClass(it.nameOfCity, it.language) })
.toList().groupBy { it.language }
}

但格式是这样的:

'english': [
{ nameOfCity: 'Los Angeles', language: 'English' },
{ nameOfCity: 'New York', language: 'English' },
],
'german': [ { nameOfCity: 'Berlin ', language: 'German' } ]

我不确定我是否理解你的意思,但我会尽力帮助你:

我假设你有3个类,如下所示:

class newClass(val nameOfCities: List<String>, val language: String)
class ListElement1(val city: String, val population: String)
class ListElement2(val nameOfCity: String, val language: String)

和2个列表:

val list1 = listOf(ListElement1("Los Angeles", "4 million"))
val list2 = listOf(ListElement2("New York", "English"), ListElement2("Berlin", "German"))

过滤列表2以删除列表1中的所有城市,并将所有城市映射到newClass:的列表

var reducedList: List<NewClass> = listOf()
list1.forEach{ listElement1 ->
= list2.filter { listElement1.city != it.nameOfCity }
.groupBy { it.language }.map { newClass(it.value.map { it.nameOfCity }, it.key) }
}

结果(json(:

[
{
language = "English",
nameOfCities= [ 
"New York"
]
},
{
language = "German",
nameOfCities= [
"Berlin"
]
}
]

结果(类别(:

[
newClass(nameOfCities=[New York], language=English), 
newClass(nameOfCities=[Berlin], language=German)
]

也许这个会很有用:

list2.filter { list2Element -> !list1.any { it.city == list2Element.nameOfCity} }
.groupBy({it.language}, {it.nameOfCity}).map { newClass(it.value, it.key) }

您可以简单地使用.any((来代替迭代和过滤

最新更新