如何對Scala中集合(Collections)進行排序

文章標題: 《如何對Scala中集合(Collections)進行排序》
本文鏈接: http://www.iteblog.com/archives/1171

下面是一系列對
Scala
中的Lists艺沼、Array進行排序的例子,數(shù)據(jù)結(jié)構(gòu)的定義如下:

// data structures working with
val s = List( "a", "d", "F", "B", "e")
val n = List(3, 7, 2, 1, 5)
val m = Map(
    -2 -> 5,
    2 -> 6,
    5 -> 9,
    1 -> 2,
    0 -> -16,
    -1 -> -4
)

利用 Scala 內(nèi)置的sorted方法進行排序

s.sorted
res0: List = List(B, F, a, d, e)

n.sorted
res1: List[Int] = List(1, 2, 3, 5, 7)

為什么我們這里不對m也排序呢调鲸?這是因為map對象沒有sorted方法挽荡!

大小寫敏感搜索

我們可以用 Scala 中的sortWith來自定義我們的對大小寫敏感的排序函數(shù)藐石。代碼如下:

/* sort alphabetical and ignoring case */
def compfn1(e1: String, e2: String) = (e1 compareToIgnoreCase e2) < 0

/* sort alphabetical and ignoring case: alternate */
def compfn2(e1: String, e2: String) = (e1.toLowerCase < e2.toLowerCase)

s.sortWith(compfn1)
res2: List = List(a, B, d, e, F)

s.sortWith(compfn2)
res3: List = List(a, B, d, e, F)

/* Or you can do so using anonymous function (Thanks Rahul) */
s.sortWith(_.toLowerCase < _.toLowerCase)
res4: List = List(a, B, d, e, F)

如何對Map中的Key或Value進行排序

// sort by key can use sorted
m.toList.sorted foreach {
    case (key, value) =>
        println(key + " = " + value)
}

-2 = 5
-1 = -4
0 = -16
1 = 2
2 = 6
5 = 9

// sort by value
m.toList sortBy ( _._2 ) foreach {
    case (key, value) =>
        println(key + " = " + value)
}

0 = -16
-1 = -4
1 = 2
-2 = 5
2 = 6
5 = 9

對源數(shù)據(jù)排序

上面的排序并不對原始的數(shù)據(jù)產(chǎn)生影響于微,排序的結(jié)果被存儲到別的變量中,如果你的元素類型是數(shù)組株依,那么你還可以對數(shù)組本身進行排序延窜,如下:

scala> val a = Array(2,6,1,9,3,2,1,-23)
a: Array[Int] = Array(2, 6, 1, 9, 3, 2, 1, -23)

scala> scala.util.Sorting.quickSort(a)

scala> a.mkString(",")
res24: String = -23,1,1,2,2,3,6,9

可以看到a數(shù)組內(nèi)部的數(shù)據(jù)已經(jīng)排好序了恋腕。如果你對上面的n進行排序逆瑞,發(fā)現(xiàn)會報出如下的錯誤:

scala> scala.util.Sorting.quickSort(n)
<console>:14: error: overloaded method value quickSort with alternatives:
  (a: Array[Float])Unit <and>
  (a: Array[Int])Unit <and>
  [K](a: Array[K])(implicit evidence$1: scala.math.Ordering[K])Unit <and>
  (a: Array[Double])Unit
 cannot be applied to (List[Int])
              scala.util.Sorting.quickSort(n)

從上面的報錯信息我們可以看出,只有Array才可以用scala.util.Sorting.quickSort方法商源。在scala.util.Sorting下面還有個stableSort函數(shù),它可以對所有Seq進行排序,返回的結(jié)果為Array扫沼。比如我們對上面的n進行排序:

scala> scala.util.Sorting.stableSort(n)
res35: Array[Int] = Array(1, 2, 3, 5, 7)

而對Array排序返回Unit

scala> val a = Array(2,6,1,9,3,2,1,-23)
a: Array[Int] = Array(2, 6, 1, 9, 3, 2, 1, -23)

scala> scala.util.Sorting.stableSort(a)

scala> a.mkString(",")
res39: String = -23,1,1,2,2,3,6,9
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缎除,一起剝皮案震驚了整個濱河市严就,隨后出現(xiàn)的幾起案子器罐,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祟印,死亡現(xiàn)場離奇詭異粟害,居然都是意外死亡蕴忆,警方通過查閱死者的電腦和手機悲幅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卓鹿,“玉大人留荔,你說我怎么就攤上這事吟孙〈婊眩” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵既荚,是天一觀的道長。 經(jīng)常有香客問我句各,道長,這世上最難降的妖魔是什么凿宾? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任兼蕊,我火速辦了婚禮,結(jié)果婚禮上孙技,老公的妹妹穿的比我還像新娘。我一直安慰自己牵啦,他們只是感情好,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布楞件。 她就那樣靜靜地躺著衫生,像睡著了一般土浸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栅迄,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音西篓,去河邊找鬼。 笑死岂津,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的吮成。 我是一名探鬼主播辜梳,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼作瞄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宗挥,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞒大,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體透敌,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡踢械,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了裸燎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泼疑。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蕴纳,到底是詐尸還是另有隱情个粱,我是刑警寧澤古毛,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布都许,位于F島的核電站,受9級特大地震影響胶征,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜睛低,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骂铁。 院中可真熱鬧,春花似錦拉庵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伸辟。三九已至馍刮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卡啰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工匈辱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亡脸。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓树酪,卻偏偏與公主長得像大州,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厦画,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Array //聲明變量arr為Array整數(shù)類型的數(shù)組,包含5個元素躯畴。 scala>valarr=newArra...
    flyskyzyl閱讀 5,671評論 0 4
  • 在scala中薇芝,排序不再像java中的那么復(fù)雜蓬抄,除了Map之外夯到,其他的集合類型都可以使用自己的排序方法,排序方法主...
    蠟筆小噺沒有煩惱閱讀 10,733評論 0 2
  • Scala的集合類可以從三個維度進行切分: 可變與不可變集合(Immutable and mutable coll...
    時待吾閱讀 5,815評論 0 4
  • 可變和不可變集合 Scala中的集合可分為可變集合和不可變集合阅爽。可變集合可以當場被更新付翁,不可變集合本身是不可變的。...
    liqing151閱讀 210評論 0 0
  • scala文檔 包含內(nèi)容 1基礎(chǔ) 2控制結(jié)構(gòu)和函數(shù) 3數(shù)組相關(guān)操作 4映射和元組 5類 6對象 7.包和引入(x)...
    zlcook閱讀 1,001評論 0 3