Scala不可变Map与元组列表

时间:2017-04-15 00:13:41

标签: scala list dictionary tuples

Scala中不可变Map和元组列表之间的区别是什么?我什么时候应该使用它们?如果两者都可能,哪一个更好?

2 个答案:

答案 0 :(得分:6)

两种数据结构完全不同。

1. Map查找时间为O(1)。在列表中,它将是O(n)

因此,如果您需要在键中查找元素 - >值映射使用map

scala> val myMap = Map("a" -> 1, "b" -> 2, "c" -> 3)
myMap: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2, c -> 3)

scala> myMap.get("a")
res7: Option[Int] = Some(1)

scala> myMap.getOrElse("a", 0)
res8: Int = 1

scala> myMap("a")
res9: Int = 1

正如其他人所指出的那样:另外两个主要区别是:

2. Map中的人必须是唯一的

scala> val myList = List(("a", 1), ("b", 2), ("a", 3))
myList: List[(String, Int)] = List((a,1), (b,2), (a,3))

scala> myList.toMap
res0: scala.collection.immutable.Map[String,Int] = Map(a -> 3, b -> 2)

3. Map未按顺序排列

scala> Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4, "e" -> 5).toList
res2: List[(String, Int)] = List((e,5), (a,1), (b,2), (c,3), (d,4))

答案 1 :(得分:3)

我不同意(与@Akavall)这两个数据结构完全不同。它们都表示键值对的序列(或者在本例中为 List )。从这个意义上说,它们是完全同源的。它们确实有不同的行为,例如@Akavall提到的查找性能。但是,该性能仅适用于作为 HashMap (或类似内容)实现的 Map 。行为的这一方面不是由 Map 本身定义的。但是, Maps 还有另外一个区别。习惯上 Map 中的键值是不同的(参见Associative Array中的定义)。

我建议每个都有它的用途。如果你有理由确定密钥是唯一的并且想要快速查找时间,那么 Map [K,V] 是最好的。 Seq [(K,V)] 是最好的,你不需要进行快速查找(或者你可能知道你可能想要在任何一个方向进行查找,即从 K- > V 或来自 V-> K )或您希望密钥可能重复时。通常在Scala中, Map 是由一系列元组构成的。