【发布时间】:2017-09-11 06:15:39
【问题描述】:
Scala 中的不可变 Map 和元组列表有什么区别?我应该什么时候使用它们中的每一个?如果两者都可以,哪一个更可取?
【问题讨论】:
标签: scala list dictionary tuples
Scala 中的不可变 Map 和元组列表有什么区别?我应该什么时候使用它们中的每一个?如果两者都可以,哪一个更可取?
【问题讨论】:
标签: scala list dictionary tuples
这两种数据结构完全不同。
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中的keys必须是唯一的
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))
【讨论】:
Map 键必须是唯一的。
我不同意(与@Akavall 一起)这两种数据结构完全不同。它们都表示键值对的序列(或 List 在这种情况下)。从这个意义上说,它们是完全同源的。它们确实有不同的行为,例如@Akavall 提到的查找性能。但是,这种性能仅适用于实现为 HashMap(或类似的东西)的 Map。 Map 本身并没有定义行为的这一方面。然而,地图还有另一个不同之处。 Map 中的键值通常是不同的(参见Associative Array 中的定义)。
我建议每个都有其用途。 Map[K,V] 如果您有理由确定键是唯一的并且需要快速查找时间,则最好。 Seq[(K,V)] 最适合您不需要进行快速查找的情况(或者您可能知道您可能希望在任一方向进行查找,即从 K- >V 或来自 V->K) 或当您期望密钥可能重复时。在 Scala 中,Map 经常由元组序列构成。
【讨论】:
Map不是一个序列(它也不扩展Seq)。 Maps 未排序。这是地图和关联列表之间的主要区别。