如何从数组列表中的值<string,long =“”>对值进行排序?

时间:2019-05-28 13:31:21

标签: java android firebase-realtime-database

是否可以在不使用比较器的情况下按降序对下面代码的当前输出进行排序?

我尝试过使用它,但是由于总是出现错误,因此我似乎无法使其正常工作。

我尝试查看这两个链接,因为我知道答案可能在那里: Sort Map<String, Long> by value reversedSort a Map<Key, Value> by values
但是,由于我对Java很陌生,所以我并没有真正获得使它正常工作所需的工作。

myRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot , String s) {
        Map<String, Object> userInfo = (Map<String, Object>)dataSnapshot.getValue();
        String username = (String) userInfo.get("username");

        Map<String, Long> steps = (Map<String, Long>) userInfo.get("steps");

        long existingSteps = 0;
        for (Map.Entry<String, Long> step : steps.entrySet()) {
            existingSteps += Long.valueOf(step.getValue());
        }

        arrayList.add(new String( username + "  -  " + "steps:  " + existingSteps));

        arrayAdapter = new ArrayAdapter<>(Leaderboard.this , 
        android.R.layout.simple_list_item_1 , arrayList);

        listView.setAdapter(arrayAdapter);
}

此代码的当前输出为:

John Doe I - Steps: 79
John Doe II - Steps: 111
John Doe III - Steps: 0
John Doe IV - Steps: 88
John Doe V - Steps: 12
John Doe VI - Steps: 0

首选此代码来运行以下输出:

John Doe II - Steps: 111
John Doe IV - Steps: 88
John Doe I - Steps: 79
John Doe V - Steps: 12
John Doe III - Steps: 0
John Doe VI - Steps: 0

有人可以向我解释我如何需要使用那些链接才能使它对我有用,以便获得上面列出的输出?

1 个答案:

答案 0 :(得分:1)

Firebase实时数据库可以返回按每个子节点的属性值排序的子节点。但是,由于您是通过汇总数据库中的值来确定existingSteps的,因此除非您也将汇总值存储在数据库中,否则无法以此顺序从数据库中获取节点。

以当前数据格式,在汇总所有用户的步骤后,您需要在客户端的数组列表中重新排序。


如果您要修改数据格式以包括聚合的existingSteps值,请记住Firebase只能以顺序返回结果。这意味着要以相反的顺序显示它们,您要么必须反转客户端的数组列表,要么在数据库中存储一个具有倒置值existingSteps的附加属性,以便对其进行排序可以得到结果相反。有关更多信息,请参见firebase -> date order reverse