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
相关产品推荐
相关产品推荐

