Scala不可变Map与元组列表

6

在Scala中,不可变的Map和元组列表有什么区别?我应该在什么情况下使用它们?如果两者都可以使用,哪一个更好?

2个回答

9

这两种数据结构非常不同。

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))

2
你没有提到一个非常重要的区别:Map 的键需要是唯一的。 - Suma

2

我不同意(@Akavall的观点),认为这两种数据结构并不完全不同。它们都代表了一个键值对序列(或在这种情况下是List)。从这个意义上讲,它们是完全相似的。它们确实具有不同的行为,例如@Akavall提到的查找性能。然而,该性能仅适用于作为HashMap(或类似物)实现的Map。该行为方面并不是由Map本身定义的。但是,Maps还有另一个区别。在Map中,键值通常是不同的(请参见关联数组中的定义)。

我建议每个都有其用途。如果您相当确定键将是唯一的并且想要快速查找时间,则最好使用Map[K,V]。如果您没有要求进行快速查找(或者可能知道您可能希望以任何方向进行查找,即从K->V或从V->K),或者预计键可能重复,则最好使用Seq[(K,V)]。在Scala中,Map通常是从元组序列构建的。


2
它们都代表了一系列的键值对。不,Map不是一个序列(也没有扩展Seq)。Map是无序的。这是Map和关联列表之间的主要区别。 - Jörg W Mittag
1
“Sequence”这个词选择得不好--我需要一个表示集合但没有任何含义的词。我并不是想暗示有顺序,当然也不是指_Seq_,否则我会明确说明的。 - Phasmid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接