I am relatively new to Java, and the whole sort by using comparators is a bit confusing to me.
Is it possible to sort the current output of the code below in descending order without using comparators?
Or is there an easier way for me to understand how to sort said values.
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);
}
The current output of this code is:
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
Is it possible to get this code to run the following output:
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
The simplest solution I can think of, is to add under each user object, the total number of steps, as a new property. In this case, there is one more thing that you need to do, which is to increment that property with the number of steps that you get every day. Your new schema should look like this:
Firebase-root
|
--- user
|
--- userId
|
--- steps
| |
| --- //daily steps
|
--- target: 100
|
--- username: "John Doe I"
|
--- totalNumberOfSteps: 111
To get the users in (ascending) order according to the totalNumberOfSteps
property, please use the following lines of code:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userRef = rootRef.child("user");
Query query = userRef.orderByChild("totalNumberOfSteps");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String username = ds.child("username").getValue(String.class);
long totalNumberOfSteps = ds.child("totalNumberOfSteps").getValue(Long.class);
Log.d(TAG, username + " - Steps: " + totalNumberOfSteps);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
query.addListenerForSingleValueEvent(valueEventListener);
Then to order it descending, please see my answer from the following post:
Finally, the result in the logcat will be:
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.