使用主要排序集合的字段对次要集合进行排序

时间:2019-10-01 07:23:05

标签: android sorting kotlin collections match

我有一个未排序的用户列表和一个已排序的用户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")
)

3 个答案:

答案 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的速度要快得多,然后一遍又一遍地重复所有条目(indexOffirst基本上都是这样做的。)

答案 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