【问题标题】:Lists and map orderings列表和地图排序
【发布时间】:2023-03-18 12:54:01
【问题描述】:

在 Scala 中,如果我们将 List[(Char, Int)] 按每对的第一个元素排序,通过 toMap 转换为映射是否会保留排序?

如果是这样,通过toList 将结果映射转换回列表是否保留排序?

【问题讨论】:

    标签: list scala map tolist


    【解决方案1】:

    不,Map(和Set)未订购。您可以使用 Scala 的交互式解释器 (REPL) 进行检查:

    scala> val elems = List('a'->1, 'b'->2, 'c'->3, 'd'->4, 'e'->5)
    elems: List[(Char, Int)] = List((a,1), (b,2), (c,3), (d,4), (e,5))
    
    scala> elems.toMap.toList
    res8: List[(Char, Int)] = List((e,5), (a,1), (b,2), (c,3), (d,4))
    

    但是,scala.collection 确实提供了 SortedMap,这可能是您正在寻找的,尽管我还没有使用过这个实现。


    编辑:实际上,这种转换还有一个更根本的问题:因为在映射中不能有重复的键,所以你不仅失去了对排序的保证,而且你的列表可能转换后的元素更少。考虑一下:

    scala> val elems = List('a'->1, 'a'->2)
    elems: List[(Char, Int)] = List((a,1), (a,2))
    
    scala> elems.toMap.toList
    res9: List[(Char, Int)] = List((a,2))
    

    【讨论】:

    • "您的列表在转换后可能包含较少的元素" 通常非常正确。因为我敢打赌这是一个来自 Coursera Scala 课程的问题,所以对于该练习,键将是唯一的 :)
    【解决方案2】:

    如前所述,MapSet 没有排序。但是考虑TreeMap,它保留了对其键的排序;比如

    val a = List(('z', 1), ('a', 4), ('b', 4))
    a: List[(Char, Int)] = List((z,1), (a,4), (b,4))
    
    val b = collection.immutable.TreeMap(a:_*)
    b: scala.collection.immutable.TreeMap[Char,Int] = Map(a -> 4, b -> 4, z -> 1)
    

    更新

    注意

    for ( (k,v) <- b ) yield k
    res: scala.collection.immutable.Iterable[Char] = List(a, b, z)
    

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多