2013-01-23 99 views
4

我希望首先根據長度對包含(word,word.length)的列表進行排序,然後按字母順序對單詞進行排序。因此,考慮:"I am a girl"輸出應該是a:1, I:1, am:2, girl:4 我有以下的代碼件,它的工作原理,但並不適用於所有的例子基於第二個屬性的Scala排序列表,然後是第一個

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

回答

12

您可以通過元組進行排序:

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) 
+0

從上面得到輸出你添加一個映射函數'val output:Array [String] = words.sortBy(w => w.length - > w.toLowerCase)map {x => x +「:」 + x.length}' – korefn

+4

+1,你每天都會學到一些東西。在查看文檔後,它的工作原理是'Ordering'對象爲元組提供了字典順序(請參見implicits'Ordering.Tuple *') –

-2

U可以做到這一點在一個行:

"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 } 
+0

您只按長度排序,而不是按長度排序+字母順序 –

+0

哦,沒有想要改變我的代碼:) – Ghashange

相關問題