Ответ 1
На странице LinkedHashMap
Scaladoc:
- "Этот класс реализует изменчивые карты с использованием хэш-таблицы. Итератор и все методы обхода этого класса посещают элементы в том порядке, в котором они были вставлен ".
В Java я использую LinkedHashMap
для этой цели. Документация Java LinkedHashMap
очень понятна, что она имеет "предсказуемый порядок итерации", и мне нужно то же самое в Scala.
Scala имеет ListMap
и LinkedHashMap
, но документация о том, что они делают, плох.
Вопрос: используется ли Scala LinkedHashMap
или ListMap
реализация для этой цели? Если нет, то какие другие опции доступны, помимо использования Java LinkedHashMap
напрямую?
На странице LinkedHashMap
Scaladoc:
Разница между двумя заключается в том, что LinkedHashMap
является изменяемым, а ListMap
неизменным. В противном случае оба они MapLike
, а также сохраняют порядок вставки.
Для LinkedHashMap ответ довольно ясен, что он сохраняет порядок вставки.
Но для ListMap кажется, что здесь есть некоторые смущения.
Во-первых, есть две ListMap.
Во-вторых, документ для ListMap имеет что-то неправильное, насколько я пытался.
Фактический порядок - это не порядок вставки, как он говорит.
И это не обратный порядок вставки. Результат, который я пробовал, - [четвертый, второй, первый, третий]
Простая измененная карта, поддерживаемая списком, поэтому она сохраняет порядок вставки.
Как говорится в документе, заказ - это порядок вставки.
Одно замечание состоит в том, что он хранится внутри в обратном порядке вставки. И внутренне сохраненный заказ и итерируемый/обходной порядок - это две вещи. Внутренне сохраненный порядок определяет временную сложность методов поиска, таких как head/last/tail/init/.
Этот класс реализует неизменяемые карты, используя структуру данных на основе списка. Итераторы списка списка и методы обхода посещают пары ключ-значение в порядке поступления сыворотки.
Записи хранятся внутри в обратном порядке вставки, что означает, что самый новый ключ находится во главе списка.
LinkedHashmap реализуется только как измененная карта ListMaps реализуются как в mutable, так и в неизменяемых пакетах, однако только неизменяемые ListMaps поддерживают обратный порядок. (измененные списки не сохраняют порядок)
ListMap
не сохраняет порядок вставки.
Только LinkedHashMap
поддерживает порядок элементов так, как они вставлены.
Если вы хотите сохранить порядок в списках otherthan Map, вы можете использовать LinkedList
Scala 2.13 представляет две новые неизменные реализации Map
которые сохраняют порядок вставки: VectorMap
и SeqMap
. Смотрите этот PR:
В настоящее время нет какой-либо известной неизменяемой карты, которая также поддерживает ключевой порядок вставки, сохраняя при этом эффективное постоянное время поиска по ключу, поэтому единственные известные реализации выполняются путем объединения вектора с HasMap (или в случае Scala HashMap/ChampHashMap)
Начиная с написания, Scala 2.13 по-прежнему планируется выпустить в 2018 году.