我拼命試圖找到一種排序字符串列表的方法,其中字符串是以下形式的預定義標識符:a1.1,a1.2,..., a1.100,a2.1,a2.2,...,a2.100,...,b1.1,b1.2等等,這是正確的順序。因此,每個標識符首先按其第一個字符排序(按字母順序降序排列),然後在此排序中按連續數字排序。我已經嘗試sortWith通過提供一個排序函數爲所有兩個連續列表成員指定上述規則。根據Scala中的多個約束排序列表
scala> List("a1.102", "b2.2", "b2.1", "a1.1").sortWith((a: String, b: String) => a.take(1) < b.take(1) && a.drop(1).toDouble < b.drop(1).toDouble)
res2: List[java.lang.String] = List(a1.102, a1.1, b2.2, b2.1)
這不是我預期的順序。然而,通過交換表達式的排序,因爲
scala> List("a1.102", "b2.2", "b2.1", "a1.1").sortWith((a: String, b: String) => (a.drop(1).toDouble < b.drop(1).toDouble && a.take(1) < b.take(2)))
res3: List[java.lang.String] = List(a1.1, a1.102, b2.1, b2.2)
這確實給了我(至少在這個例子中)所需的排序,這是我不明白也沒有。
我會很感激,如果有人可以給我一個提示那裏究竟發生了什麼,以及如何按照我的意願對列表進行排序(使用更復雜的布爾表達式,而不僅僅是比較<或>)。還有一個問題:我排序的字符串(在我的例子中)實際上是來自HashMap m的鍵。任何解決方案的效果將排序按其鍵
m.toSeq.sortWith((a: (String, String), b: (String, String)) => a._1.drop(1).toDouble < b._1.drop(1).toDouble && a._1.take(1) < b._1.take(1))
非常感謝先進!
非常感謝大家!我是Scala編程新手,但我非常喜歡它!但是我仍然遇到了一些令人頭痛的問題,比如這些;)我假設,我會找回一個列表,每個連續兩個元素都與我的約束匹配。我已經接受了第二個答案,因爲我現在對我來說都很清楚。由於每一個答案都能幫助我學到更多東西,但我對這個董事會是新手,請讓我知道,如果需要的話,我可以怎樣批准那些有用的答案!謝謝你的友好:)乾杯! – 2012-03-19 20:37:40