2016-08-15 2 views
2

Я использую Hawk в качестве замены для SharedPreferences в моей заявке.Как конвертировать/отличать HashMap к LinkedHashMap?

Я пытаюсь сохранить LinkedHashMap в нем, но по какой-то причине, когда я вытащить его из Hawk возвращается как обычный HashMap и не LinkedHashMap. В этот момент я разбился с ClassCastException, так как HashMap не может быть отправлен в LinkedHashMap прямо вперёд.

Итак, вопрос в том, как можно преобразовать возвращенный HashMap в LinkedHashMap?

+1

Спасибо за вызов. Мне нравится нетривиальный вопрос, требующий немного копания. –

+0

@DavidWasser, Спасибо за подробный ответ, почему-то не все люди думали, что это достойный вопрос. –

+1

Я понятия не имею, откуда взялись вниз. Это меня действительно удивило. –

ответ

8

Все ответы, предполагающих, что вы можете создать LinkedHashMap из HashMap являются технически правильными, но не будет дают вам желаемые результаты :-(

Конечно, вы можете создать LinkedHashMap от HashMap, но это не gua сообщите, что LinkedHashMap будет иметь тот же порядок, что и ваш оригинал.

Проблема заключается в том, что ваш LinkedHashMap сериализуется, когда он хранится в постоянном хранилище как обычный неупорядоченный Map, который НЕ сохраняет порядок отдельных элементов. Когда вы извлекаете объект из постоянного хранилища, он возвращается как обычный HashMap, и он потерял «порядок» (именно это и требовало, чтобы вы в первую очередь использовали LinkedHashMap). Если вы затем создадите LinkedHashMap из возвращенного HashMap, заказ будет, скорее всего, отличаться от оригинала.

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

Для получения более подробной информации см. my answer to this question.

+0

, и для этого я предлагаю этот пример кода: http://stackoverflow.com/a/43142613/1855855 –

1

Просто создайте новый LinkedHashMap, так как он может принимать любую карту в качестве аргумента конструктора.

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

Object будет типа, в котором вы нуждаетесь.

0

Один из конструкторов LinkedHashMap принимает Map. Он вернет LinkedHashMap с тем же содержимым, что и HashMap.

Пример кода:

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

где T является тип объектов, хранящихся в HashMap

+1

@DavidWasser Я сделал то, что было задано. Вы сделали то, что нужно. –