Сортировка вторичной коллекции с использованием поля Первичная отсортированная коллекция - PullRequest
6 голосов
/ 01 октября 2019

У меня есть несортированный список пользователей и отсортированный список идентификаторов пользователей. Идентификатор является строкой. Я хочу отсортировать первый список по второму. Как это сделать в Котлине?

data class User(val name : String, val id : String)

val unsorted = listOf<User>(
    User("Max", "b12s11"),
    User("Joe", "dj1232"),
    User("Sam", "23d112"),
    User("Tom", "k213i1")
)

val sorted = listOf<String>(
    "dj1232",
    "b12s11",
    "k213i1",
    "23d112"
)

//  what I need
val result = listOf<User>(
    User("Joe", "dj1232"),
    User("Max", "b12s11"),
    User("Tom", "k213i1"),
    User("Sam", "23d112")
)

Ответы [ 3 ]

4 голосов
/ 01 октября 2019

Сокращенное решение:

val result = unsorted.sortedBy { sorted.indexOf(it.id) }
3 голосов
/ 01 октября 2019

Хотя другие ответы показывают решение вашей проблемы, мне кажется, что Map<String, User> может лучше соответствовать цели, например:

val usersByid = unsorted.associateBy { it.id }

val result = sorted.mapNotNull {
  usersById[it]
}

Я предполагаю, что каждый идентификатор только один раз всписок, поэтому я использовал associateBy. В противном случае это не было бы для меня идентификатором; -)

Основное различие между этим решением и другими заключается в том, что это решение возвращает только те записи, которые также есть в sorted -листе. Обратите внимание, что если у вас есть пользователи, для которых у вас нет идентификатора в списке sorted, это решение пропускает их, в то время как другие решения помещают эти записи в начало списка. Зависит от того, что вы действительно хотите.

Возможно, это решение более эффективно, чем другие. Доступ к Map должен быть намного быстрее, чем повторять все записи снова и снова (что в основном делают indexOf и first).

2 голосов
/ 01 октября 2019

Я не знаю ни одного синтаксиса Kotlin для того, чтобы делать это, сортируя один список за другим, но это решение должно работать для вас (как я понял этот вопрос, было то, что вы хотите отсортировать в соответствии с Id в sorted):

 val correctList = arrayListOf<User>()

    sorted.forEach { sortedId ->

        correctList.add(unsorted.first {
            it.id == sortedId
        })
    }

Он перебирает ваш отсортированный список идентификаторов и берет элемент в первом списке (не отсортированный), который соответствует этому идентификатору, и добавляет его к correctList


Редактировать: см. Ответ @Andrei Tanana для лучшего kotlin ответа, чем мой: сортировать несортированную коллекцию с полем другой отсортированной коллекции это очень круто: D


Edit2: Спасибо @Роланд за указание, я могу еще больше упростить свой ответ с помощью:

val correctList = sorted.map { sortedId -> unsorted.first { it.id == sortedId } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...