Julia - リストをソートする方法
Juliaのソート関数
Juliaで作成したリストにはビルトイン関数のsortが使えます。 sort()はリストを引数にとり、ソートされたリストをreturnします。 エクスクラメーションマーク(!)をつけたsort!()は引数として渡すリスト自体を変更します。
list = [5,-6,-2,1,7,3,-4,9,-8] sort!(list) println(list) #結果 [-8, -6, -4, -2, 1, 3, 5, 7, 9]
ソートはオプショナル引数として、rev、lt、by、algを指定することができます。
revはtrueをわたすことで逆順にソートします。
list = [5,-6,-2,1,7,3,-4,9,-8] sort!(list, rev=true) println(list) #結果 [9, 7, 5, 3, 1, -2, -4, -6, -8]
ltに関数を渡すことで、その関数を自前のisless関数として使うことができます。 isless関数は二つの要素を引数にとり、true/falseをreturnします。falseが返された場合、二つの要素は位置が入れ替えられ、trueの場合はされません。
以下の例では、自前のisless関数を作ることにより、文字列のリストを短い→長い順にソートします。
#自前のisless関数 function comp(a, b) if length(a) < length(b) return true #文字列aが文字列bより短ければtrueを返す。 end return false #falseを返す end list = ["apple", "julia lang", "car", "physics"] #文字列のリスト sort!(list, lt= comp) #comp関数を自前のltに指定 println(list) #結果 ["car", "apple", "physics", "julia lang"]
無名関数(Anonymous function)を使えばコードが短くなります。
sort!(list, lt= (a,b)->length(a) < length(b)) #無名関数を引数として渡す
byはリストの要素一つ一つに引数となる関数が実行された状態でソートが実行されます。
list = [5,-6,-2,1,7,3,-4,9,-8] sort!(list, by= x->x^2) #リストの要素の二乗を比較してソート println(list) #結果 [1, -2, 3, 4, 5, -6, -7, -8, 9]
byを使ってタプルをソートする例 *Juliaは1-based inidexing
list = [(3, "three"), (2, "two"), (4, "four"), (1, "one")]; sort!(list, by =x -> x[1] ) #タプルの第一要素を比較してソート println(list) #結果 [(1, "one"), (2, "two"), (3, "three"), (4, "four")]
algでソートのアルゴリズムを指定することができます。
アルゴリズムにはQuickSort、InsertionSort、MergeSortなどが指定できます。