Как отсортировать значение ключа записи карты в порядке убывания?

Я относительно новичок в 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

Структура базы данных

использовать карту сортировки для java,

notTdar 27.05.2019 14:57

Возможный дубликат Сортировка Map<Key, Value> по значениям

Dinesh Shingadiya 27.05.2019 15:00

Как определяется myRef? Пожалуйста, также добавьте структуру вашей базы данных и ответьте @AlexMamo

Alex Mamo 27.05.2019 15:02

Либо используйте TreeMap с пользовательским компаратором docs.oracle.com/javase/8/docs/api/java/util/…, либо используйте SortedSet для получения значений карты. Но это все о компараторах...

Maia 27.05.2019 15:04
DatabaseReference myRef;myRef = database.getReference("user"); myRef определяется, как указано выше @AlexMamo
Molinho 27.05.2019 15:08

Также добавьте снимок экрана, чтобы увидеть содержимое объекта в пользовательском узле.

Alex Mamo 27.05.2019 15:13

изменил скриншот на один с открытым узлом @AlexMamo

Molinho 27.05.2019 15:17

Поскольку я относительно новичок в этом, я не совсем понимаю, как использовать ответы, данные в вашей ссылке @DineshShingadiya. Я пытался делать то, что они говорят, но для меня это не имеет никакого смысла.

Molinho 27.05.2019 15:24

@Molinho Теперь я вижу. Я сразу напишу вам ответ.

Alex Mamo 27.05.2019 15:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
9
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самое простое решение, которое я могу придумать, это добавить под каждым объектом пользователя общее количество шагов в качестве нового свойства. В этом случае вам нужно сделать еще одну вещь, а именно увеличить это свойство на количество шагов, которое вы делаете каждый день. Ваша новая схема должна выглядеть так:

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

Включает ли это также данные, которые добавляются позже, например, шаги, которые я пройду завтра, также учитываются?

Molinho 27.05.2019 15:45

Да, если вы ежедневно обновляете свойство totalNumberOfSteps на соответствующее количество шагов.

Alex Mamo 27.05.2019 15:46

Можно ли сделать так, чтобы он обновлялся автоматически, или только вручную?

Molinho 27.05.2019 15:48

Вы также можете сделать это автоматически, но вам нужно написать код самостоятельно. Операция проста: в каждом пользовательском объекте выполните итерацию по объекту steps, чтобы получить все шаги. Получив количество всех шагов, просто запишите его в новом свойстве. Вот так просто.

Alex Mamo 27.05.2019 15:50

Да, это то, что у меня есть на данный момент, он повторяет шаги с помощью long existingSteps = 0; for (Map.Entry<String, Long> step : steps.entrySet()) { existingSteps += Long.valueOf(step.getValue()); } Таким образом, он автоматически сохраняет сумму в «existingSteps», но тогда у меня все еще остается несортированная куча чисел. Ваш способ все же попробую, вручную тоже не проблема. Спасибо за ответы!

Molinho 27.05.2019 15:53

Да, в этом случае вам нужно только записать это значение в базу данных.

Alex Mamo 27.05.2019 15:53

Я пытался использовать ваш код, Алекс, но он не работает, он не дает никаких ошибок, но порядок остается прежним, даже при добавлении кода, чтобы упорядочить его по возрастанию.

Molinho 28.05.2019 16:44

«Это не работает» не поможет мне понять проблему, и, не видя кода, который вы используете, я не смогу вам помочь.

Alex Mamo 28.05.2019 16:49

Теперь я вижу, что вы задали другой вопрос, что обычно является лучшей практикой. Поэтому я определенно рекомендую вам использовать отвечать Фрэнка ван Паффелена.

Alex Mamo 28.05.2019 16:51

Я добавил свойство totalNumberOfSteps в свою базу данных, а затем добавил вашу строку кода в свой оператор myRef

Molinho 28.05.2019 17:09

В этом случае я рекомендую вам опубликовать еще один свежий вопрос, используя весь код, который вы использовали, чтобы я и другие разработчики Firebase могли вам помочь. Приведенный выше код работает, поскольку я тестировал его ранее, поэтому он также должен работать в вашем случае.

Alex Mamo 28.05.2019 17:33

надеюсь, вы сможете взглянуть: stackoverflow.com/questions/56345948/…

Molinho 28.05.2019 17:52

@Molinho Хорошо, я посмотрю.

Alex Mamo 28.05.2019 17:53

Другие вопросы по теме