Сортировать Arraylist по значению другого arrayylist в kotlin - PullRequest
1 голос
/ 10 июля 2020

Текущий сценарий,

У меня есть 3 Arraylist

name = [a,b,c,a]
age = [2,3,5,6]
score = [3,4,4,1]

В результате я хочу

name = [b,c,a,a]
age = [3,5,2,6]
score = [4,4,3,1]

Я подумал, что использование карты было бы полезно, но я запутался после выполнения score.map{v -> index}: |

1 Ответ

2 голосов
/ 10 июля 2020

Я предполагаю, что все ваши значения принадлежат друг другу, как в таблице, например:

        | name | age | score
------------------------------
index 0 |  a   |  2  |   3
index 1 |  b   |  3  |   4
index 2 |  c   |  5  |   4
index 3 |  a   |  6  |   1

и вы хотите отсортировать их по столбцу score.

Там есть несколько подходов к решению этой проблемы, поэтому я покажу свой любимый ниже.

Использование класса данных

Объявить класс данных

Для этой цели это будет хорошо объявить простой класс данных, который действует как оболочка для трех переменных. (Вы также можете использовать предопределенный Kotlin class Triple)

data class User(val name: String, val age: Int, val score: Int)

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

Преобразование списков

Чтобы преобразовать ваши три списка в экземпляр класс User, вы можете использовать функцию расширения Kotlin mapIndexed, которая преобразует список в список другого типа, предоставляя нам элементы и их индекс, которые нам нужны для доступа к правильным значениям в других списках .

val users = name.mapIndexed { index, value -> User(value, age[index], score[index]) }

Теперь у нас есть список пользователей, который выглядит следующим образом:

[User(name=a, age=2, score=3), User(name=b, age=3, score=4), User(name=c, age=5, score=4), User(name=a, age=6, score=1)]

Сортировать список

И теперь мы можем просто добавить sortedByDescending функция, чтобы упорядочить его в порядке убывания:

val usersSorted = name.mapIndexed { index, value -> User(value, age[index], score[index]) }.sortedByDescending { it.score }

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

Go вернуться к исходным спискам

Если вам (каким-то образом) по-прежнему нужны исходные списки, вы можете вернуть их с помощью функции map. Но учтите, что эта форма данных не очень удобна.

val name = users.map { it.name }
val age = users.map { it.age }
val score = users.map { it.score }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...