【问题标题】:Kotlin: How to map a field from list to a new list and group itKotlin:如何将列表中的字段映射到新列表并将其分组
【发布时间】:2021-04-15 18:47:24
【问题描述】:

我有两个列表

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
 }
]

所以我得到了 list1 中不存在并按相同语言分组的所有城市的新列表。

这是我得到的最接近的:

    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' } ]

【问题讨论】:

    标签: java spring list kotlin


    【解决方案1】:

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

    我假设您有 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"))
    

    过滤 list2 以删除 list1 中的所有城市并将所有城市映射到 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)
    ]
    

    【讨论】:

    • 就是这样,谢谢!我错过了地图内的附加地图。
    【解决方案2】:

    也许这个会有所帮助:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 2011-01-13
      • 2021-09-21
      • 1970-01-01
      相关资源
      最近更新 更多