2016-12-28 1 views
2

У меня есть список строкПреобразовать список на карту с ключом является индексом в Scala

val list = List("a", "b", "c", "d", "e") 

и я хочу иметь карту с ключами как индексы элементов в списке. Так что я сделал следующее:

def mapByIndexes(list: List[String]): Map[Int, String] = (1 to list.size).zip(list).toMap 

Однако, в результате чего карта не сохраняет порядок индекса, и я получаю это в результате:

Map(5 -> "e", 1 -> "a", 2 -> "b", 3 -> "c", 4 -> "d") 

Как я могу изменить код выше, так что я Получать карту со следующим, естественным порядком?

Map(1 -> "a", 2 -> "b", 3 -> "c", 4 -> "d", 5 -> "e") 

Примечание: Я знаю, что я могу просто сортировать полученную карту, но я могу избежать этого шага и создать карту, которая уже сохраняющее порядок?

Редактировать: Решение с ListMap описано в статье Scala LinkedHashMap.toMap preserves order?, но мне не нужны дополнительные круглые скобки и _* для такой простой вещи. Разве нет ничего другого, чтобы я мог просто цепочки? Если нет, я буду принимать ответ @pamu.

+1

Возможный дубликат [Scala LinkedHashMap.toMap сохраняет заказ?] (Http://stackoverflow.com/questions/6199186/scala-linkedhashmap-tomap-preserves-order) –

ответ

3

Я знаю, что я могу просто сортировать полученную карту

Нет, вы не можете. Сортировка Map не имеет смысла. Но есть Map реализации, которые хранят ключи в натуральном порядке, такие как TreeMap (IntMap также делает, IIRC). Обратите внимание, что это не так же, как и порядок сохранения, как ListMap и LinkedHashMap do.

Решение с ListMap описано в Scala LinkedHashMap.toMap сохраняет заказ? работает, но мне не нравятся дополнительные круглые скобки и _ * для такой простой вещи. Разве нет ничего другого, чтобы я мог просто цепочки?

Нет (по крайней мере, я так не думаю), но вы можете легко определить его:

implicit class ToListMap[A, B](x: Seq[(A, B)]) { 
    def toListMap = ListMap(x: _*) 
} 

// somewhere where ToListMap is in scope or imported: 
val list = List(1 -> 2, 3 -> 4) 
list.toListMap 

Имейте в виду, что ListMap в основном списке (как говорит название), так поисков в нем медленнее любой разумной реализации карты.

Конечно, вы можете сделать то же самое с TreeMap.

+0

Сортировка карты Я имел в виду то, что вы описали. Если вы google для «сортировки карты scala», это точно показывает их :) –

+0

Кстати, код, который вы предоставили, не компилируется. Я получаю «несоответствие типов»; найдено: Seq [(A, B)] требуется: (?,?) def toListMap = ListMap (x) ' –

+0

Привет, Алексей - почему вы не упоминали« SortedMap »? Разве это не относится к желанию OP для «карты», отсортированной по ее ключам? –

2

ListMap. После zipping вместо toMap, просто создайте ListMap, который сохраняет порядок элементов. Вы можете создать ListMap с помощью своего сопутствующего объекта. Он принимает var args кортежей.

def mapByIndexes(list: List[String]): ListMap[Int, String] = ListMap((1 to list.size).zip(list): _*) 

Scala РЕПЛ

scala> import scala.collection.immutable._ 
import scala.collection.immutable._ 

scala> def mapByIndexes(list: List[String]): ListMap[Int, String] = ListMap((1 to list.size).zip(list): _*) 
mapByIndexes: (list: List[String])scala.collection.immutable.ListMap[Int,String] 

scala> mapByIndexes(list) 
res10: scala.collection.immutable.ListMap[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 4 -> d, 5 -> e) 
+0

Ницца, работает и для меня.Мне не нравятся дополнительные круглые скобки и '_ *'. Разве нет ничего другого, поэтому я могу просто простую цепочку? –