Списки и порядок карт

В Scala, если у нас есть List[(Char, Int)], упорядоченный по первому элементу каждой пары, сохраняет ли преобразование в карту через toMap порядок?

Если да, то сохраняет ли порядок преобразование полученной карты обратно в список с помощью toList?


person Pinxaton    schedule 23.10.2014    source источник


Ответы (2)


Нет, MapSet) не заказаны. Вы можете проверить это с помощью интерактивного интерпретатора Scala (REPL):

scala> val elems = List('a'->1, 'b'->2, 'c'->3, 'd'->4, 'e'->5)
elems: List[(Char, Int)] = List((a,1), (b,2), (c,3), (d,4), (e,5))

scala> elems.toMap.toList
res8: List[(Char, Int)] = List((e,5), (a,1), (b,2), (c,3), (d,4))

Однако scala.collection предоставляет SortedMap, что может быть тем, что вы ищете, хотя я еще не использовал эту реализацию.


Редактировать: На самом деле, с этим преобразованием связана еще более фундаментальная проблема: поскольку у вас не может быть дубликатов ключей на карте, вы не только теряете гарантии при упорядочении, но и ваш список может содержать меньше элементов. после преобразования. Учти это:

scala> val elems = List('a'->1, 'a'->2)
elems: List[(Char, Int)] = List((a,1), (a,2))

scala> elems.toMap.toList
res9: List[(Char, Int)] = List((a,2))
person Kulu Limpa    schedule 24.10.2014
comment
ваш список может иметь меньше элементов после преобразования В целом правильно. Так как я готов поспорить, что это вопрос, возникающий из курса Coursera Scala, для этого упражнения ключи будут уникальными :) - person The Archetypal Paul; 24.10.2014

Как упоминалось выше, Map и Set не имеют порядка. Однако рассмотрим TreeMap, который сохраняет порядок своих ключей; например

val a = List(('z', 1), ('a', 4), ('b', 4))
a: List[(Char, Int)] = List((z,1), (a,4), (b,4))

val b = collection.immutable.TreeMap(a:_*)
b: scala.collection.immutable.TreeMap[Char,Int] = Map(a -> 4, b -> 4, z -> 1)

Обновить

Обратите внимание, что

for ( (k,v) <- b ) yield k
res: scala.collection.immutable.Iterable[Char] = List(a, b, z)
person elm    schedule 24.10.2014