Kotlin: объединить три списка в один с выбранными данными из трех списков

#android #kotlin

#Android #kotlin

Вопрос:

Я должен создать новый список, объединенный с тремя другими списками, и использовать его в качестве подробного списка. Вот как это выглядит:

 @Parcelize
data class Detail(
val photoId: Int,        //Photo
val photoTitle: String,  //Photo
val albumTitle: String,  //Album
val username: String,    //User
val email: String,       //User
val phone: String,       //User
val url: String.         //Photo
) : Parcelable
  

Я назначил модель каждому свойству. Для свойства с именем PhotoID требуется поле идентификатора из фотографии, для photoTitle требуется заголовок из фотографии, для albumTitle требуется заголовок из альбома и так далее. Я знаю, как это сделать с помощью фильтра на основе двух списков, но понятия не имею, как это сделать с тремя списками.
Это мое предыдущее решение для двух списков:

 if (albumsList.isNotEmpty() amp;amp; photosList.isNotEmpty()) {
                                                                                                      //Merging the lists of RawAlbum and
        val albumsById: Map<Int, RawAlbum> = albumsList.associateBy { it.id }                        // RawPhoto in the one ListItem list.

         itemList = photosList.filter { albumsById[it.id] != null }.map { photosList ->
             albumsById[photosList.id]?.let { albumsList ->
                 ListItem(albumsList.id, albumsList.title, photosList.title, photosList.thumbnailUrl)
             }!!
         }
  

Ответ №1:

Вы пытаетесь объединить все уникальные элементы из трех списков в один список? Вы можете попробовать оператор объединения стандартной библиотеки Kotlin.

Вероятно, сделайте что-то вроде ((list1 union list2) union list3)

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

1. Спасибо за вашу идею, но я создал свое собственное решение. Спасибо.

Ответ №2:

Я нашел очень простой ответ на свой вопрос. Конечно, код нуждается в некоторых улучшениях сохранения, но работает. Мне не нужен новый список в этом решении, он сразу переходит к требуемой модели.

  private fun setDetail(id: Int) {
    if (albumsList.isNotEmpty() amp;amp; photosList.isNotEmpty() amp;amp; userList.isNotEmpty()) {

        if (id != null) {
            var photo = photosList[id]
            var user = userList[id]
            var album = albumsList[id]

            var detail = Detail(photo.id, photo.title, user.username, album.title, user.email, user.phone, photo.url)
            Timber.e(detail.toString())

            onDetailsFragment(detail)

        }
    }
}