Kotlin: как сопоставить поле из списка с новым списком и сгруппировать его

#java #spring #list #kotlin

#java #весна #Список #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)
 

Итак, мне нужно проверить, находятся ли названия городов в списке2 внутри списка 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' } ]
 

Ответ №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"))
 

Фильтруйте список 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)
]
 

Комментарии:

1. Вот и все, спасибо! Мне не хватало дополнительной карты внутри карты.

Ответ №2:

Может быть, это будет полезно:

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

Вместо итерации и фильтрации вы можете просто использовать .any()