我想根据学生的受欢迎程度对学生列表进行排序(此列表总是按他们的分数排序),然后按字母顺序对不在该列表中的学生进行排序

  • 这两份榜单如下所示:
students = listOf<Student>(
    Student(id = 3, name ="mike"),
    Student(id = 2,name ="mathew"),
    Student(id = 1,name ="john"),
    Student(id = 4,name ="alan")
)
val popularity = listOf<Ranking>(
    Ranking(id= 2, points = 30),
    Ranking(id= 3, points = 15)
)
  • 我想要的结果是:
[
 Student(id=2,name"mathew"), <- first, because of popularity
 Student(id=3,name="mike"),
 Student(id=4,name="alan"), <- starting here by alphabetical order
 Student(id=1,name="john")
]

如果有人知道这件事的有效方法,我将不胜感激.

推荐答案

将排名作为列表是次优的,因为要查找东西,您需要每次都浏览列表,如果您有很多排名,这会很慢.如果你确实有很多这样的 map ,我建议你先把它们做成 map .你可以使用associate从列表中很容易地做到这一点.

然后,您可以创建一个自定义比较器,先按受欢迎程度进行比较,然后按名称进行比较,并在sortedWith中使用它:

val studentIdToPopularity = popularity.associate { it.id to it.points }

val studentComparator = compareByDescending<Student> { studentIdToPopularity[it.id] ?: 0 }.thenBy { it.name }
val sortedStudents = students.sortedWith(studentComparator)

你可以在这里看到结果:https://pl.kotl.in/a1GZ736jZ

Student(id=2, name=mathew)
Student(id=3, name=mike)
Student(id=4, name=alan)
Student(id=1, name=john)

Kotlin相关问答推荐

Kotlin 海峡没有结束

如何在Kotlin中为接受varargs的函数添加带有默认值的新参数?

Mockk:对同一函数进行两次存根会忽略第一个行为

在 map 中查找键与在 kotlin 中查找 firstOrNull

始终抛出的函数 - 具有块主体的函数中需要的返回表达式

有什么方法可以要求在 kotlin 中的类型参数上进行注释?

Kotlin:使用另一个列表和字母顺序对列表进行排序的有效方法

mutableStateOf 在 Jetpack Compose 中不记住 API 的情况下保持重组后的值

在 Compose 中使用 Text() 时如何获取文本的大小?

Kotlin 使用委托进行隐式覆盖

如果不为空,则为 builder 设置一个值 - Kotlin

Dagger 2 ContributesAndroidInjector 为模块提供活动

如何在 IntelliJ 中更改 Kotlin 的this property has a backing field代码编辑器突出显示?

如何从 Java 中隐藏 Kotlin 的 lateinit var 支持字段?

Kotlin默认使用哪种排序?

Kotlin lambda 语法混淆

Kotlin协程无法处理异常

将字符串转换为HashMap的最简单方法

WebFlux 功能:如何检测空 Flux 并返回 404?

Android studio,构建kotlin时出现奇怪错误:生成错误代码