在scala中的Map中排序列表

时间:2013-02-01 21:35:51

标签: scala

我有一张地图:

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

2 个答案:

答案 0 :(得分:5)

这似乎有效:

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)

答案 1 :(得分: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)))