首页 > 解决方案 > 根据kotlin中另一个arraylist的值对arraylist进行排序

问题描述

目前的情况,

我有 3 个数组列表

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

标签: android-studiokotlin

解决方案


我假设您的值都像表格一样属于彼此,例如:

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

如果要存储一个对象的两个以上的值,最好使用类,尤其是在这种情况下。

返回原始列表

map如果您(不知何故)仍然需要原始列表,您可以使用该函数取回它们。但请注意,这种形式的数据不是很方便。

val name = users.map { it.name }
val age = users.map { it.age }
val score = users.map { it.score }

推荐阅读