You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按分数降序排序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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:44:59