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

Java 7中如何对Realm Results进行数值排序?

解决Realm大数字符串按数字排序的问题

我来帮你搞定这个棘手的排序问题!针对你遇到的Realm代理对象、SDK版本限制这些痛点,咱们一步步来解决:

第一步:补全实体类的Getter方法

首先你的Leaderboard类缺少字段的getter方法,Realm的对象是动态代理,直接访问字段或者调用默认toString都会返回类似proxy[((75000))]的代理格式,根本拿不到真实的score字符串。所以先给实体类加上getter:

public class Leaderboard extends RealmObject {
    private String score;

    // 添加Getter方法,获取真实的score字符串
    public String getScore() {
        return score;
    }
}

第二步:提取真实的score值到普通List

RealmResults是Realm管理的实时查询集合,不能直接修改或排序,所以咱们先把distinct后的真实score值提取到普通的ArrayList里:

RealmResults<Leaderboard> leaderboardList = realm.where(Leaderboard.class)
        .distinct("score")
        .findAll();

List<String> scoreList = new ArrayList<>();
for (Leaderboard item : leaderboardList) {
    String scoreStr = item.getScore();
    // 避免空值导致后续排序报错
    if (scoreStr != null && !scoreStr.isEmpty()) {
        scoreList.add(scoreStr);
    }
}

第三步:用BigInteger实现数字排序(兼容SDK16)

你说SDK16没法用Stream和lambda,但咱们可以用传统的匿名内部类实现Comparator,配合Collections.sort来按数字顺序排序(注意这里是按数值大小,不是字符串字典序):

Collections.sort(scoreList, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        // 把字符串转成BigInteger,直接比较数值大小
        BigInteger num1 = new BigInteger(s1);
        BigInteger num2 = new BigInteger(s2);
        // 升序排序,要降序就换成num2.compareTo(num1)
        return num1.compareTo(num2);
    }
});

第四步:输出排序后的结果

现在遍历这个排序后的List就能得到按数字顺序排列的score了:

for (String sortedScore : scoreList) {
    System.out.println("排序后的分数:" + sortedScore);
    // 或者用Android的Log输出:Log.d("Leaderboard", sortedScore);
}

这样就完美解决了所有问题:既拿到了真实的score字符串,又在SDK16的限制下实现了大数的数字排序,还避开了Realm代理对象的坑。

内容的提问来源于stack exchange,提问作者zngb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:18:46