【问题标题】:Scala sort list based on second attribute and then firstScala排序列表基于第二个属性,然后是第一个
【发布时间】:2013-01-06 13:43:24
【问题描述】:

我希望首先根据长度对包含 (word, word.length) 的列表进行排序,然后按字母顺序对单词进行排序。所以给定:"I am a girl" 输出应该是a:1, I:1, am:2, girl:4 我有以下代码,但不适用于所有示例

val lengths = words.map(x => x.length)
val wordPairs = words.zip(lengths).toList
val mapwords = wordPairs.sort (_._2 < _._2).sortBy(_._1)

【问题讨论】:

    标签: list scala sorting tuples


    【解决方案1】:

    可以按元组排序:

    scala>  val words = "I am a girl".split(" ")
    words: Array[java.lang.String] = Array(I, am, a, girl)
    
    scala>  words.sortBy(w => w.length -> w)
    res0: Array[java.lang.String] = Array(I, a, am, girl)
    
    scala>  words.sortBy(w => w.length -> w.toLowerCase)
    res1: Array[java.lang.String] = Array(a, I, am, girl)
    

    【讨论】:

    • 要从上面获取输出,您添加一个映射函数val output:Array[String] = words.sortBy(w =&gt; w.length -&gt; w.toLowerCase) map {x =&gt; x + ":" + x.length }
    • +1,你每天都能学到一些东西。在文档中查找后,它可以工作,因为 Ordering 对象为元组提供了字典顺序(请参阅隐式 Ordering.Tuple*
    【解决方案2】:

    你可以在一行中做到这一点:

     "I am a girl".toLowerCase.split(" ").map(x => (x,x.length)).sortWith { (x: (String,Int), y: (String,Int)) => x._1 < y._1 }
    

    或分两行:

     val wordPairs = "I am a girl".split(" ").map(x => (x,x.length))
     val result = wordPairs.toLowerCase.sortWith { (x: (String,Int), y: (String,Int)) => x._1 < y._1 }
    

    【讨论】:

    • 你只是按长度排序,而不是按长度+字母顺序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2019-05-24
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多