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

时间:2016-07-17 15:54:05

标签: java android firebase hashmap 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();
....

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

{DummyData1=0, try=0, dummy2=5, lalala=10, Name1=0, try2=0, lala=11, try3=0, la=3, dummy=1}

所以,没有明显的顺序。

最后,问题是你如何推荐我订购创建的HashMap,以便将Key和Value对存储在相应的TextView中(TextViews的第一行中的最佳得分手和最高分,依此类推) 。

As a reference, how I plan on showcasing the leaderboard

谢谢!

2 个答案:

答案 0 :(得分:3)

你做错了两件事:

  1. 您没有告诉Firebase按任何值订购数据
  2. 您将结果转换为地图,这本身就是无序的
  3. 假设您在Score下有这个JSON结构(请在下次提问时将JSON发布为文本):

    Score
    

    代码如下:

    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));
            }
    

    它会打印出来:

      

    PUF = 30

         

    Polarbear0106 = 42

         

    KatoWulf = 60

答案 1 :(得分:1)

Sort a Map<Key, Value> by values (Java)

这将返回按值排序的新地图:(需要java 8)

public static <K, V extends Comparable<? super V>> Map<K, V> 
    sortByValue( Map<K, V> map )
{
    Map<K, V> result = new LinkedHashMap<>();
    Stream<Map.Entry<K, V>> st = map.entrySet().stream();

    st.sorted( Map.Entry.comparingByValue() )
        .forEachOrdered( e -> result.put(e.getKey(), e.getValue()) );

    return result;
}