【问题标题】:Scala immutable Map vs List of tuplesScala不可变映射与元组列表
【发布时间】:2017-09-11 06:15:39
【问题描述】:

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

【问题讨论】:

    标签: scala list dictionary tuples


    【解决方案1】:

    这两种数据结构完全不同。

    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 键必须是唯一的。
    【解决方案2】:

    我不同意(与@Akavall 一起)这两种数据结构完全不同。它们都表示键值对的序列(或 List 在这种情况下)。从这个意义上说,它们是完全同源的。它们确实有不同的行为,例如@Akavall 提到的查找性能。但是,这种性能仅适用于实现为 HashMap(或类似的东西)的 MapMap 本身并没有定义行为的这一方面。然而,地图还有另一个不同之处。 Map 中的键值通常是不同的(参见Associative Array 中的定义)。

    我建议每个都有其用途。 Map[K,V] 如果您有理由确定键是唯一的并且需要快速查找时间,则最好。 Seq[(K,V)] 最适合您不需要进行快速查找的情况(或者您可能知道您可能希望在任一方向进行查找,即从 K- >V 或来自 V->K) 或当您期望密钥可能重复时。在 Scala 中,Map 经常由元组序列构成。

    【讨论】:

    • "它们都代表一系列键值对。" – 不,Map不是一个序列(它也不扩展Seq)。 Maps 未排序。这是地图和关联列表之间的主要区别。
    • “序列”这个词选错了——我需要一个意思是收集但没有任何暗示的词。我并不是要暗示一个排序,我当然也不是想要 Seq,否则我会这么说。
    猜你喜欢
    • 2018-11-15
    • 2015-04-30
    • 2023-04-09
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2015-08-18
    相关资源
    最近更新 更多