首页 文章

Kotlin按范围内的值排序数组

提问于
浏览
2

让我们有 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在这种情况下是否有话要说 .

1 回答

  • 3

    您可以先按 positiontime 排序,然后按 time 分组,使用标准的Kotlin功能 .

    示例

    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 }
    

    说明

    • Playerpositiontime 排序 ArraysortedWith compareBy

    • 将它分组 Playerposition

    结果

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

相关问题