如何按分数降序排序Firebase获取的玩家数据数组?
解决方法
核心问题是你现在直接把姓名和分数拼接成字符串存入列表,丢失了分数的数值信息,没法按分数排序。正确的做法是先保存包含姓名和分数的完整数据,排序后再转换成展示用的字符串。
步骤1:定义数据类存储玩家信息
先创建一个数据类,用来单独保存每个玩家的姓名和分数(注意把分数转成数值类型,比如Int,这样才能正确排序):
data class Player(val name: String, val score: Int)
步骤2:修改Firebase数据读取逻辑
不再直接拼接字符串,而是先把有效玩家数据存入Player对象列表,再对列表按分数降序排序,最后转换成展示用的字符串数组:
usersRef.addListenerForSingleValueEvent(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { val playerList = mutableListOf<Player>() for (userSnapshot in snapshot.children) { val name = userSnapshot.child("name").getValue(String::class.java) // 把分数字符串转成Int,用toIntOrNull避免转换失败崩溃 val score = userSnapshot.child("score").getValue(String::class.java)?.toIntOrNull() if (name != null && score != null) { playerList.add(Player(name, score)) } } // 按分数降序排序 val sortedPlayers = playerList.sortedByDescending { it.score } // 转换成展示用的字符串数组 val displayList = sortedPlayers.map { "${it.name} ${it.score} pts" }.toTypedArray() builder.setItems(displayList) { _, which -> // 后续逻辑不变 when (which) { 0 -> { } 1 -> { } // ... } } // 记得调用builder的show()之类的方法显示弹窗 } override fun onCancelled(error: DatabaseError) { // 处理读取失败的情况 } })
关键说明
- 必须将分数从
String转为数值类型(Int/Long),否则字符串排序会出现错误(比如"99"会排在"100"前面) - 用
sortedByDescending对玩家列表按分数降序排列,这一步依赖分数的数值类型 - 最后再将排序后的玩家数据转换成你需要的展示字符串,保证排序逻辑正确
内容的提问来源于stack exchange,提问作者rui
相关产品推荐
相关产品推荐

