2016-07-17 5 views
1

Neu bei Java Programmierung und konnte keine Antwort dafür finden.HashMap nach Wert organisieren (Firebase Datenbank Snapshot)

Ich erstellte eine Firebase-Datenbank für ein kleines Spiel, das ich gebaut und es geschafft habe, die Scores korrekt zu speichern. Jetzt möchte ich die Rangliste mit den besten zehn Punkten aufbauen. Die Datenbank selbst wird durch Top-Scores indiziert, und ich bekomme die Top 10 punktet mit:

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(); 
.... 

Das Problem dabei ist, dass (von dem, was ich sehen kann), was ich erhalten, ist eine HashMap, die ich in topScores speichern. Auch von dem, was ich bisher verstehen, sind HashMaps unorganisiert, so dass, wenn Sie es drucken, es so etwas wie folgt aussieht:

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

Also, keine erkennbare Ordnung. Die Frage ist, wie würde ich Ihnen empfehlen, die HashMap zu sortieren, die erstellt wurde, um die Schlüssel- und Wertpaare in der entsprechenden Textansicht zu speichern (der Top-Scorer und die höchste Punktzahl in der ersten Zeile von TextViews usw.)).

As a reference, how I plan on showcasing the leaderboard

Dank!

Antwort

0

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

Dies wird eine neue Karte mit dem Wert sortiert zurückgeben: (Java 8 erforderlich)

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; 
} 
+0

Hey, vielen Dank für die Antwort. Kann ich Sie mit einer Klärung darüber belehren, wie ich das verwenden würde? Es scheint, dass ich die JDK 7 Version in Android Studio (von dem, was ich gerade lese), also nach dem Hinzufügen dieser Methode und läuft: 'topScores = (Map ) dataSnapshot.getValue(); Log.d (TAG, "onDataChange:" + topScores); sortByValue (topScores); Log.d (TAG, "onDataChange:" + topScores); ' Die Karte topScores wird beide Male in der gleichen Reihenfolge gedruckt. Was mache ich falsch? Vielen Dank! –

+0

Hallo.Würdest du diese Frage googeln, bevor du sie fragst? – Zoe

+0

Klicken Sie auf den Link oben auf der Antwort für noch mehr Lösungen und Erklärungen zu allem – Zoe

3

Sie sind falsch zwei Dinge zu tun:

  1. bist du nicht Firebase zu sagen, um die Daten durch einen beliebigen Wert
  2. bestellen Sie konvertieren die Ergebnisse in eine Karte, die inhärent ungeordnet ist

Unter der Annahme, dass Sie diese JSON Struktur unter Score haben (bitte die JSON als Text nächstes Mal schreiben Sie eine Frage stellen):

Score 

Der Code wäre:

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

Und es wird gedruckt:

Puf = 30

Polarbear0106 = 42

KatoWulf = 60

+0

Hey Frank. Danke für die Antwort. Wenn ich ".OrderByValue()" hinzufüge, bringt es die zehn niedrigsten Werte, nicht die höchsten. Irgendeine Idee warum? Außerdem ruft 'DataSnapshot child in dataSnapshot.getChildren()' einige Analysefehler in Android Studio ab. Fehlt etwas? –

+0

Ja, du willst 'limitToLast (10)', da die Reihenfolge in Firebase * immer * aufsteigend ist. Das 'In' ist in der Tat ein Tippfehler. Ich habe beide in der Antwort behoben, empfehle aber, dass Sie sich ein wenig mit der [Dokumentation zum Sortieren und Filtern] beschäftigen (https://firebase.google.com/docs/database/android/retrieve-data#sort_data). –

+0

Großartig. Danke Frank! –