Подтвердить что ты не робот

Scala Выполнение сохранения карты в порядке ввода?

В Java я использую LinkedHashMap для этой цели. Документация Java LinkedHashMap очень понятна, что она имеет "предсказуемый порядок итерации", и мне нужно то же самое в Scala.

Scala имеет ListMap и LinkedHashMap, но документация о том, что они делают, плох.

Вопрос: используется ли Scala LinkedHashMap или ListMap реализация для этой цели? Если нет, то какие другие опции доступны, помимо использования Java LinkedHashMap напрямую?

4b9b3361

Ответ 1

На странице LinkedHashMap Scaladoc:

  • "Этот класс реализует изменчивые карты с использованием хэш-таблицы. Итератор и все методы обхода этого класса посещают элементы в том порядке, в котором они были вставлен ".

Ответ 2

Разница между двумя заключается в том, что LinkedHashMap является изменяемым, а ListMap неизменным. В противном случае оба они MapLike, а также сохраняют порядок вставки.

Ответ 3

Для LinkedHashMap ответ довольно ясен, что он сохраняет порядок вставки.

Но для ListMap кажется, что здесь есть некоторые смущения.

Во-первых, есть две ListMap.

  • scala.collection.mutable.ListMap
  • scala.collection.immutable.ListMap.

Во-вторых, документ для ListMap имеет что-то неправильное, насколько я пытался.

mutable.ListMap

Фактический порядок - это не порядок вставки, как он говорит.

И это не обратный порядок вставки. Результат, который я пробовал, - [четвертый, второй, первый, третий]

Простая измененная карта, поддерживаемая списком, поэтому она сохраняет порядок вставки.

immutable.ListMap

Как говорится в документе, заказ - это порядок вставки.

Одно замечание состоит в том, что он хранится внутри в обратном порядке вставки. И внутренне сохраненный заказ и итерируемый/обходной порядок - это две вещи. Внутренне сохраненный порядок определяет временную сложность методов поиска, таких как head/last/tail/init/.

Этот класс реализует неизменяемые карты, используя структуру данных на основе списка. Итераторы списка списка и методы обхода посещают пары ключ-значение в порядке поступления сыворотки.

Записи хранятся внутри в обратном порядке вставки, что означает, что самый новый ключ находится во главе списка.

Ответ 4

  • LinkedHashmap находится в том порядке, в котором он был добавлен.
  • (неизменяемый) ListMap находится в обратном порядке, в который он был добавлен (т.е. последний добавлен первый)

LinkedHashmap реализуется только как измененная карта ListMaps реализуются как в mutable, так и в неизменяемых пакетах, однако только неизменяемые ListMaps поддерживают обратный порядок. (измененные списки не сохраняют порядок)

Ответ 5

ListMap не сохраняет порядок вставки.

введите описание изображения здесь

Только LinkedHashMap поддерживает порядок элементов так, как они вставлены.

введите описание изображения здесь

Если вы хотите сохранить порядок в списках otherthan Map, вы можете использовать LinkedList

введите описание изображения здесь

Ответ 6

Scala 2.13 представляет две новые неизменные реализации Map которые сохраняют порядок вставки: VectorMap и SeqMap. Смотрите этот PR:

В настоящее время нет какой-либо известной неизменяемой карты, которая также поддерживает ключевой порядок вставки, сохраняя при этом эффективное постоянное время поиска по ключу, поэтому единственные известные реализации выполняются путем объединения вектора с HasMap (или в случае Scala HashMap/ChampHashMap)

Начиная с написания, Scala 2.13 по-прежнему планируется выпустить в 2018 году.