在Scala中,不可变的Map和元组列表有什么区别?我应该在什么情况下使用它们?如果两者都可以使用,哪一个更好?
在Scala中,不可变的Map和元组列表有什么区别?我应该在什么情况下使用它们?如果两者都可以使用,哪一个更好?
这两种数据结构非常不同。
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
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))
我不同意(@Akavall的观点),认为这两种数据结构并不完全不同。它们都代表了一个键值对序列(或在这种情况下是List)。从这个意义上讲,它们是完全相似的。它们确实具有不同的行为,例如@Akavall提到的查找性能。然而,该性能仅适用于作为HashMap(或类似物)实现的Map。该行为方面并不是由Map本身定义的。但是,Maps还有另一个区别。在Map中,键值通常是不同的(请参见关联数组中的定义)。
我建议每个都有其用途。如果您相当确定键将是唯一的并且想要快速查找时间,则最好使用Map[K,V]。如果您没有要求进行快速查找(或者可能知道您可能希望以任何方向进行查找,即从K->V或从V->K),或者预计键可能重复,则最好使用Seq[(K,V)]。在Scala中,Map通常是从元组序列构建的。
Map
不是一个序列(也没有扩展Seq
)。Map
是无序的。这是Map
和关联列表之间的主要区别。 - Jörg W Mittag
Map
的键需要是唯一的。 - Suma