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

zour9fqk  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(377)

我有两张单子

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的城市名是否在list2中(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' } ]
svmlkihl

svmlkihl1#

我不确定我是否理解你的意思,但我尽力帮助你:
我假设你有如下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中的所有城市并将所有城市Map到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)
]
idv4meu8

idv4meu82#

也许这本书会很有用:

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

不用迭代和过滤,只需使用.any()

wtzytmuj

wtzytmuj3#

我不知道我是否理解你的问题,如果不是,我很抱歉,我还是新来的。我可能会在list接口中使用.contains()方法(无论您使用的是works、arraylist、linkedlist和vector,我很确定它们都有该方法,因为它们实现了list接口)。因此,我将使用for each遍历其中一个列表,并使用.contains()方法。我希望这有帮助我知道这不是最好的答案。抱歉,如果这不是你想要的答案,祝你有愉快的一天。

相关问题