В Scala Map реализованы записи в порядке вставки? - PullRequest
39 голосов
/ 01 октября 2010

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

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

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

Ответы [ 6 ]

46 голосов
/ 01 октября 2010

Со страницы LinkedHashMap Scaladoc:

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

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

6 голосов
/ 22 апреля 2017

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

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

Во-первых, существует две ListMap,

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

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

mutable.ListMap

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

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

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

immutable.ListMap

Поскольку документ гласит, что порядок - это порядок вставки.

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

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

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

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

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

2 голосов
/ 12 декабря 2016

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

enter image description here

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

enter image description here

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

enter image description here

0 голосов
/ 27 августа 2018

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

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

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

...