【问题标题】:Sort List within Map in scalascala中地图内的排序列表
【发布时间】:2013-02-01 21:35:50
【问题描述】:

我有一张这样的地图:

val v = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))

我根本找不到对地图中的列表项进行排序的方法。

我试过了:

v.flatMap(v => v._2.sortBy(list => list._))

但似乎它不会对列表项进行排序。

有人知道我哪里错了吗?

更新:实际上我的列表是像List[(Object1, Object2, Object3, Object4)] 这样的元组列表,为了简单起见,我放了int。 (但我认为_.sorted 不适用于我的对象案例)。所以我基本上想按此对象列之一进行排序。 (例如Object1.int

【问题讨论】:

    标签: scala


    【解决方案1】:

    这似乎有效:

    v.mapValues(_.sorted)
    // Map(01 -> List(12, 14, 23, 34), 11 -> List(11, 22, 34))
    

    如果你的值是元组,试试这个:

    v.mapValues(_.sortBy(_._1))
    

    这种方法也适用于类,例如_.sortBy(_.age).


    或者如果你想要一个,合并列表:

    v.values.flatten.toSeq.sorted
    // List(11, 12, 14, 22, 23, 34, 34)
    

    (用于元组列表):

    v.values.flatten.toSeq.sortBy(_._1)
    

    【讨论】:

    • 有没有办法在这个元组列表中动态插入另一个元素?我的意思是不创建新地图?
    • @CristianBoariu:您也可以使用mapValues() 从一个元组映射到另一个元组。请随意提出另一个问题以使其更清楚。
    • 这没有就地排序。有没有办法做到这一点而不是将其设置为等于新地图?或者这是不好的做法?
    【解决方案2】:

    你的意思是这样吗?

    val v = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34))
    //v: scala.collection.immutable.Map[String,List[Int]] = Map(01 -> List(34, 12, 14, 23), 11 -> List(22, 11, 34))
    
    v map { case (k, v) => (k -> v.sorted) }
    //res0: scala.collection.immutable.Map[String,List[Int]] = Map(01 -> List(12, 14, 23, 34), 11 -> List(11, 22, 34))
    

    编辑或:

    v mapValues (_ sorted)
    //res1: scala.collection.immutable.Map[String,List[Int]] = Map(01 -> List(12, 14, 23, 34), 11 -> List(11, 22, 34))
    

    另一个修改:

    如果您的元组中的所有类型在作用域内都存在隐式 Ordering,它的工作方式应该完全相同:

    val v = Map(
      "01" -> List((34, "thirty-four"), (12, "twelve"), (14, "fourteen"), (23, "twenty-three")), 
      "11" -> List((22, "twenty-two"), (11, "eleven"), (34, "thirty-four")))
    //v: scala.collection.immutable.Map[String,List[(Int, String)]] =
    //Map(
    //  01 -> List((34,thirty-four), (12,twelve), (14,fourteen), (23,twenty-three)), 
    //  11 -> List((22,twenty-two), (11,eleven), (34,thirty-four)))
    
    v mapValues (_ sorted)
    //res3: scala.collection.immutable.Map[String,List[(Int, String)]] =
    //Map(
    //  01 -> List((12,twelve), (14,fourteen), (23,twenty-three), (34,thirty-four)),
    //  11 -> List((11,eleven), (22,twenty-two), (34,thirty-four)))
    

    如果你只想按元组的一个成员排序(比如......在这种情况下是第二个):

    v mapValues (_ sortBy (_ _2))
    //res5: scala.collection.immutable.Map[String,List[(Int, String)]] =
    //Map(
    //  01 -> List((14,fourteen), (34,thirty-four), (12,twelve), (23,twenty-three)),
    //  11 -> List((11,eleven), (34,thirty-four), (22,twenty-two)))
    

    【讨论】:

    • 或者可能是v mapValues { _.sorted }
    猜你喜欢
    • 2011-06-15
    • 2023-03-18
    • 2014-12-08
    • 1970-01-01
    • 2014-01-20
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多