Kotlin 按范围内的值对数组进行排序

Kotlin sort array by value in range

让我们有一个 class Player(val position: Int, val time: Float),我们想按 positionplayers 的数组或列表进行排序。如果这些players中有一些在第一次排序后有相同的position,我们想按time分组排序。按组我的意思是一组 players 具有相同的位置。

我知道

list.sortedWith(compareBy<Foo> { it.a }.thenByDescending { it.b }.thenBy { it.c })

当然这并不能解决这个问题。

在 Kotlin 中有什么聪明的方法可以完成这个简单的任务吗?我们可以通过检查位置和交换项目来手动排序,但我想知道 Kotlin 在这种情况下是否有话要说。

您可以先按 positiontime 排序,然后使用标准 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 }

描述

  1. PlayerpositiontimesortedWith + compareBy
  2. Array 进行排序
  3. Playerposition
  4. 分组

结果

结果是 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)]
    }