按值组织 HashMap(Firebase 数据库快照)

Mar*_*ina 4 java android hashmap firebase firebase-realtime-database

Java 编程新手,无法找到答案。

我为我构建的一个小游戏创建了一个 Firebase 数据库,并设法使分数正确存储。现在我想建立排名前十的排行榜。数据库本身由最高分索引,我得到了前 10 名的分数:

mDatabase.child(gameName).child("Score").limitToFirst(10).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Get user value
            HashMap<String,Long> topScores = (HashMap<String, Long>) dataSnapshot.getValue();
....
Run Code Online (Sandbox Code Playgroud)

问题在于(从我所见)我收到的是一个 HashMap,我将其存储在 topScores 中。同样,根据我目前的理解,HashMaps 是无组织的,所以当你打印它时,它看起来像这样:

{DummyData1=0, try=0, dummy2=5, lalala=10, Name1=0, try2=0, lala=11, try3=0, la=3, dummy=1}
Run Code Online (Sandbox Code Playgroud)

所以,没有明显的顺序。

最后,问题是您建议我如何对创建的 HashMap 进行排序,以便将 Key 和 Value 对存储在其相应的 TextView 中(TextView 第一行中的最高分和最高分,依此类推)。

作为参考,我打算如何展示排行榜

谢谢!

Fra*_*len 6

你做错了两件事:

  1. 您没有告诉 Firebase 按任何值对数据进行排序
  2. 您正在将结果转换为 Map,它本质上是无序的

假设您有以下 JSON 结构Score(下次提问时请将 JSON 作为文本发布):

Score
Run Code Online (Sandbox Code Playgroud)

代码将是:

mDatabase.child(gameName).child("Score")
         .orderByValue().limitToLast(10).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot child: dataSnapshot.getChildren()) {
            System.out.println(child.getKey()+"="+child.getValue(Long.class));
        }
Run Code Online (Sandbox Code Playgroud)

它会打印:

粉扑=30

北极熊0106=42

加藤武夫=60