2

我想按键长度对 scala 映射进行排序。地图看起来像:

val randomMap = Map("short" -> "randomVal1", "muchlonger" -> "randomVal2")

我想对 randomMap 进行排序,这样当我迭代它时,我会首先从最长的键开始......所以它应该首先迭代“更长”的元素。

4

2 回答 2

3

将其转换为键/值对序列并应用排序标准。例如。:

randomMap.toSeq.sortBy(_._1.length).reverse

(相反,因为默认情况下它按最短到最长排序)。

于 2013-09-06T03:13:50.523 回答
1

一种选择是为 a 定义自定义排序TreeMapTreeMap是一个排序的实现Map

import scala.collection.immutable.TreeMap

implicit object LengthOrder extends Ordering[String] { 
    def compare(s1: String, s2: String) = s1.length - s2.length 
}

val randomMap = TreeMap("111" -> "111", "1" -> "1", "11" -> "11")

//randomMap: TreeMap[String,String] = Map(1 -> 1, 11 -> 11, 111 -> 111)

val keys = randomMap.keys
//keys: Iterable[String] = Set(1, 11, 111)

请注意,这将影响范围内的所有TreeMap[String]s LengthOrder。在您的项目中,您可以嵌套LengthOrder在另一个项目中object(或将其放入自己的包中),然后仅将其导入需要它的特定代码块中。


编辑:

@Bharadwaj 很好地说明了这将如何破坏除一个具有相同长度的键之外的所有键。这样的事情可以解决这个问题:

implicit object LengthOrder extends Ordering[String] { 
    def compare(s1: String, s2: String) = s1.length - s2.length match {
      case 0 => s1.compareTo(s2)
      case x => x
    }
}
于 2013-09-06T09:20:21.553 回答