我正在構建一個 Android 應用程式,我想在其中實作自定義排序 User
讓我詳細解釋一下要求。
假設有 15 個用戶存盤在ArrayListof 型別中,User并且每個用戶都有單獨的角色映射。用戶grouped by roles的順序必須相同as below。
1.Mechanic
2.Plumber
3.Electrician
此外,在角色組中,它們應該主要基于unread message count,其次基于alphabetical order
案例 1:沒有未讀訊息
基于role-based grouping和alphabetical sorting(沒有未讀訊息),用戶應該以如下方式顯示。(括號中的'0'表示未讀訊息數)
Aarav,Mechanic(0)
Dhruv,Mechanic(0)
Jason,Mechanic(0)
Pranav,Mechanic(0)
Zeplin,Mechanic(0)
Amit,Plumber(0)
Baskaran,Plumber(0)
Garry,Plumber(0)
Rakesh,Plumber(0)
Shekar,Plumber(0)
Balu,Electrician(0)
Ragunathan,Electrician(0)
Prem kumar,Electrician(0)
Saravanan,Electrician(0)
Thanigaivel,Electrician(0)
案例 2:未讀訊息計數
當有用戶(角色內)的未讀聊天計數時,串列應優先考慮他們在串列中的優先級,字母順序應被視為次要。它通常應如下所示。
Zeplin,Mechanic(20)
Pranav,Mechanic(10)
Aarav,Mechanic(0)
Dhruv,Mechanic(0)
Jason,Mechanic(0)
Garry,Plumber(5)
Rakesh,Plumber(5)
Amit,Plumber(0)
Baskaran,Plumber(0)
Shekar,Plumber(0)
Prem kumar,Electrician(10)
Balu,Electrician(0)
Ragunathan,Electrician(0)
Saravanan,Electrician(0)
Thanigaivel,Electrician(0)
請幫我完成這個。
以下是我嘗試過的
fun getListWithGroupingAndSorting(){
val users = ArrayList<User>
// Writing logic to pull list of users from server and assigning to `users`
return ArrayList(users.sortedWith(compareByDescending<User> {
it.unreadMessageCount
}.thenBy {
it.firstName
}))
}
這主要根據未讀訊息數對串列進行排序,其次根據字母順序排序,但無法以上述方式完成。
uj5u.com熱心網友回復:
你實際上進入了正確的方向。您只需要另外按角色排序。像這樣的東西:
val rolesOrder = mapOf("Mechanic" to 1, "Plumber" to 2, "Electrician" to 3)
users.sortedWith(
compareBy<User> { rolesOrder[it.role] }
.thenByDescending { it.unreadMessageCount }
.thenBy { it.firstName }
)
如果你真的需要對專案進行分組而不是僅僅對它們進行排序,那么你需要類似的東西Map<Role, List<Users>>,那么:
users.groupByTo(sortedMapOf(compareBy { rolesOrder[it] })) { it.role }
.mapValues { (_, value) ->
value.sortedWith(
compareByDescending<User> { it.unreadMessageCount }
.thenBy { it.firstName }
)
}
如果你有一個有序的角色串列并且你需要為它們分配索引,你可以這樣做:
val rolesOrder = listOf("Mechanic", "Plumber", "Electrician")
.withIndex()
.associate { it.value to it.index }
請注意,如果 中缺少角色rolesOrder,則用戶將放在開頭。如果這是一種可能的情況,并且您想將它們放在最后,則比較以下角色:
rolesOrder[it.role] ?: Integer.MAX_VALUE
uj5u.com熱心網友回復:
我相信布魯特的回答很好;如果你需要一個“作業示例”,我相信有更聰明/更好/更多的 kotlin 方法,但為什么不從簡單開始。
在 5 分鐘內,您可以想出一個在 kotlin playground 中運行的示例。
本質上:
data class User(val role: String, val unread: Int = 0)
fun main() {
val unsorted = listOf(User("Mechanic", 5),
User("Plumber", 3),
User("Electrician", 2),
User("Mechanic", 9),
User("Mechanic", 1),
User("Electrician", 8),
User("Mechanic", 4),
User("Plumber", 0))
// Group them
val sortedByRole = unsorted
.groupBy { it.role }
.forEach { k, group ->
val sortedGroup = group.sortedByDescending { user -> user.unread }
println(sortedGroup)
}
}
輸出:
[User(role=Mechanic, unread=9), User(role=Mechanic, unread=5), User(role=Mechanic, unread=4), User(role=Mechanic, unread=1)]
[User(role=Plumber, unread=3), User(role=Plumber, unread=0)]
[User(role=Electrician, unread=8), User(role=Electrician, unread=2)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/323882.html
