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

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

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

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

6 ответов

Решение

От LinkedHashMap Страница Скаладока:

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

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

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

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

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

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

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

mutable.ListMap

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

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

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

immutable.ListMap

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам