Kotlin 按范围内的值对数组进行排序
Kotlin sort array by value in range
让我们有一个 class Player(val position: Int, val time: Float)
,我们想按 position
对 players
的数组或列表进行排序。如果这些players
中有一些在第一次排序后有相同的position
,我们想按time
分组排序。按组我的意思是一组 players
具有相同的位置。
我知道
list.sortedWith(compareBy<Foo> { it.a }.thenByDescending { it.b }.thenBy { it.c })
当然这并不能解决这个问题。
在 Kotlin 中有什么聪明的方法可以完成这个简单的任务吗?我们可以通过检查位置和交换项目来手动排序,但我想知道 Kotlin 在这种情况下是否有话要说。
您可以先按 position
和 time
排序,然后使用标准 Kotlin 功能按 time
分组。
例子
data class Player(val position: Int, val time: Float)
val p1 = Player(1, 10f)
val plys = arrayOf(p1, p1.copy(position = 3),
p1.copy(time = 0f), p1.copy(time = 20f),
p1.copy(position = 2), p1.copy(position = 2, time = 20f))
val groupBy = plys.sortedWith(compareBy(Player::position, Player::time))
.groupBy { it.position }
描述
- 按
Player
的 position
和 time
与 sortedWith
+ compareBy
对 Array
进行排序
- 按
Player
的 position
分组
结果
结果是 Map<Int,List<Player>
,在示例中如下所示:
{
1=[Player(position=1, time=0.0), Player(position=1, time=10.0), Player(position=1, time=20.0)],
2=[Player(position=2, time=10.0), Player(position=2, time=20.0)],
3=[Player(position=3, time=10.0)]
}
让我们有一个 class Player(val position: Int, val time: Float)
,我们想按 position
对 players
的数组或列表进行排序。如果这些players
中有一些在第一次排序后有相同的position
,我们想按time
分组排序。按组我的意思是一组 players
具有相同的位置。
我知道
list.sortedWith(compareBy<Foo> { it.a }.thenByDescending { it.b }.thenBy { it.c })
当然这并不能解决这个问题。
在 Kotlin 中有什么聪明的方法可以完成这个简单的任务吗?我们可以通过检查位置和交换项目来手动排序,但我想知道 Kotlin 在这种情况下是否有话要说。
您可以先按 position
和 time
排序,然后使用标准 Kotlin 功能按 time
分组。
例子
data class Player(val position: Int, val time: Float)
val p1 = Player(1, 10f)
val plys = arrayOf(p1, p1.copy(position = 3),
p1.copy(time = 0f), p1.copy(time = 20f),
p1.copy(position = 2), p1.copy(position = 2, time = 20f))
val groupBy = plys.sortedWith(compareBy(Player::position, Player::time))
.groupBy { it.position }
描述
- 按
Player
的position
和time
与sortedWith
+compareBy
对 - 按
Player
的position
分组
Array
进行排序
结果
结果是 Map<Int,List<Player>
,在示例中如下所示:
{
1=[Player(position=1, time=0.0), Player(position=1, time=10.0), Player(position=1, time=20.0)],
2=[Player(position=2, time=10.0), Player(position=2, time=20.0)],
3=[Player(position=3, time=10.0)]
}