2015-07-13 5 views
2

У меня возникла проблема с присоединением пар к существующей карте. Как только я доберусь до пятой пары Карты, Карта переупорядочивается. Порядок правилен с 4 парами, но как только добавляется 5, он сдвигается. Смотрите пример ниже (при условии, я построил 4 пары на карте одну пару раз.):scala map + = оператор с пятью парами

scala> val a = Map("a1" -> 1, "a2" -> 1, "a3" -> 1, "a4" -> 1) 
a: scala.collection.immutable.Map[String,Int] = Map(a1 -> 1, a2 -> 1, a3 -> 1, a4 -> 1) 

scala> a += ("a5" -> 1) 
scala> a 
res26: scala.collection.immutable.Map[String,Int] = Map(a5 -> 1, a4 -> 1, a3 -> 1, a1 -> 1, a2 -> 1) 

Добавленный пятый элемент подскочил к передней части карты и сдвигает другие вокруг. Есть ли способ сохранить элементы в порядке (1, 2, 3, 4, 5)?

Благодаря

+0

Если вы хотите сохранить порядок вставки, смотреть на это [ вопрос] (http://stackoverflow.com/questions/3835743/scala-map-implementation-keeping-entries-in-insertion-order). –

ответ

3

По умолчанию в Scala immutable.Map использует HashMap.

От http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html:

Этого класс не дает никаких гарантий относительно того, карты; в частности, это не гарантирует, что порядок будет оставаться неизменным в течение долгого времени

Так карта действительно не таблица, которая содержит "a1" -> 1, но таблица, которая содержит hash("a1") -> 1. Карта переупорядочивает свои ключи на основе хеша ключа, а не ключа, который вы ему вложили.

Как было рекомендовано в комментариях, используйте LinkedHashMap или ListMap: Scala Map implementation keeping entries in insertion order?

PS: Вы могли бы быть заинтересованы в чтении этой статьи: http://howtodoinjava.com/2012/10/09/how-hashmap-works-in-java/