【问题标题】:Sorting Secondary Collection using Primary Sorted Collection's field使用 Primary Sorted Collection 的字段对二级集合进行排序
【发布时间】:2020-01-30 10:57:01
【问题描述】:

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

【问题讨论】:

  • 所以您想按用户名的字母顺序对列表进行排序?

标签: android sorting kotlin collections match


【解决方案1】:

更短的解决方案:

val result = unsorted.sortedBy { sorted.indexOf(it.id) }

【讨论】:

    【解决方案2】:

    虽然其他答案显示了您的问题的解决方案,但在我看来 Map&lt;String, User&gt; 可能更适合此目的,例如:

    val usersByid = unsorted.associateBy { it.id }
    
    val result = sorted.mapNotNull {
      usersById[it]
    }
    

    我假设每个 id 在列表中只有一次,因此我使用了associateBy。否则它不会是我的 id ;-)

    此解决方案与其他解决方案的主要区别在于,此解决方案仅返回同样在sorted-list 中的条目。请注意,如果您在 sorted-list 中有没有 id 的用户,则此解决方案会忽略它们,而其他解决方案会将这些条目放在列表的前面。取决于你真正想要什么。

    这个解决方案可能比其他解决方案更有效。访问Map 应该比一遍又一遍地重复所有条目要快得多(indexOffirst 基本上都这样做)。

    【讨论】:

    • 是的,当我最初看到这个问题时,我也想过使用另一种数据结构,但后来实现它的挑战有点接管了:P 也很好的答案
    【解决方案3】:

    我不知道任何 Kotlin 语法可以做到这一点,将一个列表逐个排序,但这个解决方案应该适合你(我理解这个问题的方式是,你想根据 @987654322 中的 ID 进行排序@):

     val correctList = arrayListOf<User>()
    
        sorted.forEach { sortedId ->
    
            correctList.add(unsorted.first {
                it.id == sortedId
            })
        }
    

    它会遍历您的已排序 Id 列表,并获取与该 ID 匹配的第一个列表(未排序)中的项目并将其添加到 correctList


    编辑:请参阅@Andrei Tanana 的答案以获得比我更好的 kotlin 答案:sort unsorted collection with another sorted collection's field 这很酷:D


    Edit2:感谢@Roland 的指出,我可以进一步简化我的答案:

    val correctList = sorted.map { sortedId -> unsorted.first { it.id == sortedId } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多