1: // Java風格的代碼
2: def oldSchoolSort(xs: Array[Int]) {
3: //Scala支援嵌套函數
4: def sort1(l: Int, r: Int) {
5: val pivot = xs((l + r) / 2)
6: var i = l
7: var j = r
8: while(i <= j) {
9: while(xs(i) < pivot) i += 1
10: while(xs(j) > pivot) j -= 1
11: if(i < j && xs(i) != xs(j)) swap(i, j)
12: if(i <= j) {
13: i += 1
14: j -= 1
15: }
16: }
17: if(l < j) sort1(l, j)
18: if(r > i) sort1(i, r)
19: }
20:
21: // Scala是種“面向表達式”的語言,每個函數都會傳回值。如果沒有東西可以傳回,那麼預設傳回 ()
22: // () 屬于Unit類。傳回Unit的函數也被稱為procedures。如果函數不是傳回Unit,那麼,函數體前
23: // 面必須加上 "="
24: def swap(i: Int, j: Int) {
25: val t = xs(i); xs(i) = xs(j); xs(j) = t
26: () // 可以省略,加上則明确表明傳回Unit
27: }
28:
29: sort1(0, xs.length - 1)
30: }
31:
32: // 更具函數風格的sort,注意filter為“partially applied function”,即部分實作函數(有譯作
33: // 偏應用函數的,不敢苟同),另外,pivot > 的完整形式為:x => pivot > x
34: def sort(xs: Array[Int]): Array[Int] = {
35: if(xs.length <= 1) xs else {
36: val pivot = xs(xs.length / 2)
37: Array.concat(sort(xs filter (pivot >)), xs filter (pivot ==),
38: sort(xs filter (pivot <)))
39: }
40: }
41:
42: val xs = Array(23, 3, 0, -3, 3, 12)
43: println(sort(xs).mkString(", "))
以上代碼中的oldSchoolSort已經小小的修改了下,原書的例子有些小小的界樁錯誤,雖然不影響結果,但是卻幾乎降低了一半的效能。另外,說到效能,不能不提一下記憶體的問題。不像舊式風格的代碼隻是在原有的對象上進行修改,函數風格的代碼(sort)會生成不變對象來進行傳遞,運作時需要臨時占用更多的記憶體。
Scala by Example PDF下載下傳,原書為Scala官網上的示例。
PS. 昨天在Groovy和Android項目上遇到的IDEA故障今天出現在了Scala上,我英明神武的斷言此乃檔案系統權限問題,并一舉命中selinux。關閉Selinux後,一切恢複了和諧……
PS II. 和諧了沒多久,發現Scala支援的配置機制有bug,遂将Scala運作時從Global級别降級到Project Level,順利“繞過”問題。
PS III. 然後就發現ibus在IDEA中不斷的丢失焦點……也就是說在IDEA裡打中文從此隻能“偶爾為之”。
PS IV. 最後想用Ctrl+Alt+L格式化代碼,結果熱鍵沖突,導緻作業系統鎖定,隻好悲憤的重敲一遍十幾位的密碼……
Technorati 标簽: Scala