我想按键长度对 scala 映射进行排序。地图看起来像:
val randomMap = Map("short" -> "randomVal1", "muchlonger" -> "randomVal2")
我想对 randomMap 进行排序,这样当我迭代它时,我会首先从最长的键开始......所以它应该首先迭代“更长”的元素。
将其转换为键/值对序列并应用排序标准。例如。:
randomMap.toSeq.sortBy(_._1.length).reverse
(相反,因为默认情况下它按最短到最长排序)。
一种选择是为 a 定义自定义排序TreeMap
。TreeMap
是一个排序的实现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
}
}