Я относительно новичок в 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
Возможный дубликат Сортировка Map<Key, Value> по значениям
Как определяется myRef
? Пожалуйста, также добавьте структуру вашей базы данных и ответьте @AlexMamo
Либо используйте TreeMap с пользовательским компаратором docs.oracle.com/javase/8/docs/api/java/util/…, либо используйте SortedSet для получения значений карты. Но это все о компараторах...
DatabaseReference myRef;
myRef = database.getReference("user");
myRef определяется, как указано выше @AlexMamo
Также добавьте снимок экрана, чтобы увидеть содержимое объекта в пользовательском узле.
изменил скриншот на один с открытым узлом @AlexMamo
Поскольку я относительно новичок в этом, я не совсем понимаю, как использовать ответы, данные в вашей ссылке @DineshShingadiya. Я пытался делать то, что они говорят, но для меня это не имеет никакого смысла.
@Molinho Теперь я вижу. Я сразу напишу вам ответ.
Самое простое решение, которое я могу придумать, это добавить под каждым объектом пользователя общее количество шагов в качестве нового свойства. В этом случае вам нужно сделать еще одну вещь, а именно увеличить это свойство на количество шагов, которое вы делаете каждый день. Ваша новая схема должна выглядеть так:
Firebase-root
|
--- user
|
--- userId
|
--- steps
| |
| --- //daily steps
|
--- target: 100
|
--- username: "John Doe I"
|
--- totalNumberOfSteps: 111
Чтобы получить пользователей в (возрастающем) порядке в соответствии со свойством totalNumberOfSteps
, используйте следующие строки кода:
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);
Затем, чтобы упорядочить его по убыванию, см. Мой ответ из следующего сообщения:
Наконец, результат в logcat будет таким:
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
Включает ли это также данные, которые добавляются позже, например, шаги, которые я пройду завтра, также учитываются?
Да, если вы ежедневно обновляете свойство totalNumberOfSteps
на соответствующее количество шагов.
Можно ли сделать так, чтобы он обновлялся автоматически, или только вручную?
Вы также можете сделать это автоматически, но вам нужно написать код самостоятельно. Операция проста: в каждом пользовательском объекте выполните итерацию по объекту steps
, чтобы получить все шаги. Получив количество всех шагов, просто запишите его в новом свойстве. Вот так просто.
Да, это то, что у меня есть на данный момент, он повторяет шаги с помощью long existingSteps = 0; for (Map.Entry<String, Long> step : steps.entrySet()) { existingSteps += Long.valueOf(step.getValue()); }
Таким образом, он автоматически сохраняет сумму в «existingSteps», но тогда у меня все еще остается несортированная куча чисел. Ваш способ все же попробую, вручную тоже не проблема. Спасибо за ответы!
Да, в этом случае вам нужно только записать это значение в базу данных.
Я пытался использовать ваш код, Алекс, но он не работает, он не дает никаких ошибок, но порядок остается прежним, даже при добавлении кода, чтобы упорядочить его по возрастанию.
«Это не работает» не поможет мне понять проблему, и, не видя кода, который вы используете, я не смогу вам помочь.
Теперь я вижу, что вы задали другой вопрос, что обычно является лучшей практикой. Поэтому я определенно рекомендую вам использовать отвечать Фрэнка ван Паффелена.
Я добавил свойство totalNumberOfSteps
в свою базу данных, а затем добавил вашу строку кода в свой оператор myRef
В этом случае я рекомендую вам опубликовать еще один свежий вопрос, используя весь код, который вы использовали, чтобы я и другие разработчики Firebase могли вам помочь. Приведенный выше код работает, поскольку я тестировал его ранее, поэтому он также должен работать в вашем случае.
надеюсь, вы сможете взглянуть: stackoverflow.com/questions/56345948/…
@Molinho Хорошо, я посмотрю.
использовать карту сортировки для java,