2016-08-15 4 views
2

Ich verwende Hawk als Ersatz für SharedPreferences in meiner Anwendung.Wie konvertiert man HashMap in LinkedHashMap?

Ich versuche, ein LinkedHashMap darin zu speichern, aber aus irgendeinem Grund, wenn ich es wieder aus Hawk ziehen kehrt als reguläres HashMap und kein LinkedHashMap. An diesem Punkt stürze ich mit einem ClassCastException als HashMap kann nicht direkt gegossen werden.

Die Frage ist also, wie kann ich die zurückgegebene HashMap zu einem konvertieren?

+1

Danke für die Herausforderung. Ich liebe eine nicht-triviale Frage, die ein bisschen Graben erfordert. –

+0

@DavidWasser, Vielen Dank für Ihre ausführliche Antwort, aus irgendeinem Grund nicht alle Leute dachten, es sei eine anständige Frage. –

+1

Ich habe keine Ahnung woher die Downvotes kommen. Das hat mich eigentlich überrascht. –

Antwort

8

alle Antworten darauf hindeutet, dass Sie ein LinkedHashMap von einem HashMap technisch korrekt sind erstellen können, aber nicht gebe dir die gewünschten Ergebnisse :-(

Natürlich kannst du aus einer HashMap eine LinkedHashMap erstellen, aber es ist nicht gua rested, dass die die gleiche Reihenfolge haben wird, die Ihr Original tat.

Das Problem ist, dass Ihre serialisiert wird, wenn es in den persistenten Speicher als eine einfache ungeordnete Map gespeichert wird, die nicht die Reihenfolge der einzelnen Elemente beharrt. Wenn Sie dann das Objekt aus dem persistenten Speicher extrahieren, wird es als eine Ebene HashMap zurückgegeben, und es hat die "Bestellung" verloren (für die Sie eine für in erster Linie wollten). Wenn Sie dann einen LinkedHashMap aus dem zurückgegebenen HashMap erstellen, wird sich die Bestellung höchstwahrscheinlich vom Original unterscheiden.

Um dies richtig durchzuführen, sollten Sie wahrscheinlich Ihre in ein geordnetes Array von Objekten konvertieren und dieses sortierte Array im persistenten Speicher ablegen. Sie können dann das bestellte Array von Objekten aus dem persistenten Speicher zurücklesen und die in der richtigen Reihenfolge neu erstellen. Grundsätzlich müssen Sie die selbst serialisieren und deserialisieren.

Weitere Informationen finden Sie unter my answer to this question.

+0

und um das zu erreichen, schlage ich dieses Codebeispiel vor: http://stackoverflow.com/a/43142613/1855855 –

1

Erstellen Sie einfach eine neue LinkedHashMap, da sie jede Map als Konstruktorargument verwenden kann.

LinkedHashMap<Object> newMap = new LinkedHashMap<>(theHashMapReturnedFromHawk); 

Object wäre der Typ, den Sie benötigen.

0

Einer der LinkedHashMap Konstruktoren akzeptiert eine Map. Es wird ein LinkedHashMap mit dem gleichen Inhalt wie HashMap zurückgegeben.

Codebeispiel:

LinkedHashMap<T> newMap = new LinkedHashMap<T>(hashmap); 

wo T ist die Art der gespeicherten Objekte in den HashMap

+1

@DavidWasser Ich habe getan, was gefragt wurde. Du hast getan, was gebraucht wurde. –

Verwandte Themen