В 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 что-то не так, насколько я пытался.
Фактический порядок не является порядком вставки, как говорится.
И это не обратный порядок вставки. Результат, который я попробовал: [далее, второй, первый, третий]
Простая изменяемая карта, поддерживаемая списком, поэтому она сохраняет порядок вставки.
Как говорится в документе, этот порядок является порядком вставки.
Следует отметить, что он хранится внутри в обратном порядке вставки. И внутренне сохраненный порядок, и порядок итерации / обхода - это две вещи. Внутренне сохраненный порядок определяет временную сложность методов поиска, таких как 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 поддерживают обратный порядок. (изменяемые списки не поддерживают порядок)