我有一个未排序的用户列表和一个已排序的用户ID列表。 id是一个字符串。 我想按第二个排序第一列表。如何在Kotlin中做到这一点?
data class User(val name : String, val id : String)
val unsorted = listOf<User>(
User("Max", "b12s11"),
User("Joe", "dj1232"),
User("Sam", "23d112"),
User("Tom", "k213i1")
)
val sorted = listOf<String>(
"dj1232",
"b12s11",
"k213i1",
"23d112"
)
// what I need
val result = listOf<User>(
User("Joe", "dj1232"),
User("Max", "b12s11"),
User("Tom", "k213i1"),
User("Sam", "23d112")
)
答案 0 :(得分:4)
更短的解决方案:
val result = unsorted.sortedBy { sorted.indexOf(it.id) }
答案 1 :(得分:3)
尽管其他答案都可以解决您的问题,但在我看来Map<String, User>
可能更适合此目的,例如:
val usersByid = unsorted.associateBy { it.id }
val result = sorted.mapNotNull {
usersById[it]
}
我假设列表中每个id都只有一次,因此我使用了associateBy
。否则,这对我来说不是ID;-)
此解决方案与其他解决方案之间的主要区别在于,此解决方案仅返回也在sorted
列表中的条目。请注意,如果您的用户在sorted
列表中没有ID,则此解决方案将其忽略,而其他解决方案会将这些条目放在列表的最前面。取决于您真正想要的。
此解决方案可能比其他解决方案更有效。访问Map
的速度要快得多,然后一遍又一遍地重复所有条目(indexOf
和first
基本上都是这样做的。)
答案 2 :(得分:2)
我不知道执行此操作的任何Kotlin语法,即按一个列表对另一个列表进行排序,但是此解决方案应该对您有用(我理解此问题的方式是,您想根据{{ 1}}):
sorted
它遍历您的ID排序列表,并将与该ID匹配的第一个列表(未排序)中的项目取走,并将其添加到 val correctList = arrayListOf<User>()
sorted.forEach { sortedId ->
correctList.add(unsorted.first {
it.id == sortedId
})
}
编辑:请参阅@Andrei Tanana的答案以获得比我的更好的Kotlin答案:sort unsorted collection with another sorted collection's field这很酷:D
Edit2:感谢@Roland指出,我可以进一步简化答案:
correctList