【问题标题】:How can i sort a medal table array in Kotlin?如何在 Kotlin 中对奖牌表数组进行排序?
【发布时间】:2022-06-10 22:21:43
【问题描述】:

我正在为一个学校项目工作,我需要使用 Kotlin 对多维数组进行排序。该数组包含奖牌数组。我需要像奖牌表一样对其进行排序,具体取决于奖牌重量和奖牌数量。

数组是这样的:

[0] -> [0,0,0,0,0] (对于每个索引,有一个由 5 个奖牌组成的数组,每个奖牌的权重从 0 到 4,0 是最不重要的,4是最多的。

填充数组示例:

[0] -> [0,17,0,0,2]
[1] -> [1,0,0,0,0]
[2] -> [0,12,39,21,0]
[3] -> [0,13,0,11,17]

我需要这样的东西:

[1] -> [1,0,0,0,0]
[0] -> [0,17,0,0,2]
[3] -> [0,13,0,11,17]
[2] -> [0,12,39,21,0]

非常感谢。

【问题讨论】:

  • 请让我们知道您尝试了什么以及您面临的问题
  • 我没有遇到任何问题,正如标题中提到的那样,这是一个简单的问题,因为我不知道该怎么做。我尝试的是使用嵌套的 for 循环,但使用 kotlin 我知道还有更多有用和清晰的方法。

标签: arrays kotlin sorting multidimensional-array


【解决方案1】:

您可以使用sortedArrayWith 接受Comparator

多个选项。

val medals = arrayOf(
    arrayOf(0,17,0,0,2), 
    arrayOf(1,0,0,0,0), 
    arrayOf(0,12,39,21,0), 
    arrayOf(0,13,0,11,17)
)

val sorted = medals.sortedArrayWith { a1, a2 ->
    a1.zip(a2)
        .find { it.first != it.second }
        ?.let { it.second - it.first } ?: 0
}

val sorted = medals.sortedArrayWith { a1, a2 ->
   a1.zip(a2).forEach {
        if(it.first != it.second) return@sortedArrayWith it.second-it.first
    }
    0
}

想法是找到计数不匹配的第一对/索引,并返回最大值。

解决方案是通用的,适用于任何大小的嵌套数组

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您希望按第一个、第二个、第三个等元素排序,然后按降序排列:

    val list = arrayOf(
      arrayOf(0, 17, 0, 0, 2),
      arrayOf(1, 0, 0, 0, 0),
      arrayOf(0, 12, 39, 21, 0),
      arrayOf(0, 13, 0, 11, 17)
    )
    
    val result = list
      .sortedArrayWith(
        compareByDescending<Array<Int>> { it[0] }
          .thenByDescending { it[1] }
          .thenByDescending { it[2] }
          .thenByDescending { it[3] }
          .thenByDescending { it[4] }
      )
    
    result.forEach { println(it.toList()) }
    

    【讨论】:

      猜你喜欢
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2021-12-21
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      相关资源
      最近更新 更多