Scala中不可变Map和元组列表之间的区别是什么?我什么时候应该使用它们?如果两者都可能,哪一个更好?
答案 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 是由一系列元组构成的。