配列(リスト)をソートするには (sort / sortBy / sorted / sortWith)

Java

Arrays.sort(arr);
Collections.sort(lst);

// 比較方法を指定
Arrays.sort(arr, new Comparator<String>() {
    public int compare(String str1, String str2) {
        return str1.compareToIgnoreCase(str2);
    }
});
Collections.sort(lst, new Comparator<String>() {
    public int compare(String str1, String str2) {
        return str1.compareToIgnoreCase(str2);
    }
});

// Java8から書けるSAM(single abstract method)の記法
Arrays.sort(arr, (str1, str2) -> str1.compareToIgnoreCase(str2));
Collections.sort(lst, (str1, str2) -> str1.compareToIgnoreCase(str2));

Scala

sortedList = lst.sorted;

// 比較する値を指定
sortedList = lst.sortBy(_.toLowerCase);

// 比較方法を指定
sortedList = lst.sortWith((str1, str2) => str1.compareToIgnoreCase(str2) < 0);

PHP

sort($arr);

// 比較方法を指定
usort($arr, function ($a, $b) {
    return strcasecmp($a, $b);
});

Python

sortedList = sorted(lst)

// リスト自身を変更する方法
lst.sort()

Ruby

sortedArray = arr.sort

# 配列自身を変更する方法
arr.sort!

# 比較方法を指定
sortedArray = arr.sort  {|a, b| a.downcase <=> b.downcase}
arr.sort!{|a, b| a.downcase <=> b.downcase}

Java

Signature:

staticメソッドで、ソートしたい配列またはリストをメソッドに引数で渡す。配列またはリスト自体を変更する破壊的なメソッド。

2つ目の引数に Comparator を渡すことで比較方法を指定することもできる。

Arrays.sort は配列の要素型ごとにsortメソッドが用意されている。

java.util.Comparator | Java Platform SE 8 Javadoc
http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html

Scala

Signature:

def scala.collection.Seq[A]#sorted: Seq[A]
def scala.collection.Seq[A]#sortBy(f: A => B): Seq[A]
def scala.collection.Seq[A]#sortWith(lt: (A, A) => Boolean): Seq[A]

いずれもソート結果のリストを返し、自身は変更しない。

要素の型が比較可能であれば(scala.math.Ordering[A]の実装があれば、といえばいいのか?)、 sortedメソッドでソート結果を直接得られる。

sortByメソッドは、要素を直接比較してソートするのではなく、要素から何かしらの関数を適用して適用結果でソートする。適用結果は比較可能でなければいけない。

val lst = List("abc", "defg", "hi");
val result = lst.sortBy(_.length);
println(result);
// => List(hi, abc, defg)

ちなみに、(Int, Int)Seq[Int] などの、比較可能な要素からなるタプルやリストも比較可能である。

sortWithメソッドは、要素を比較する方法を直接関数で与えてソートする。

val lst = List("abc", "defg", "hi");
val result = lst.sortWith((a, b) => a.length < b.length);
println(result);
// => List(hi, abc, defg)

PHP

sort関数でソートできる。引数の配列自身を変更する破壊的な関数である。

sort($arr);

要素の比較方法を関数で指定するには代わりに usort を使う。

usort($arr, $comparator);

$arr = array("abc", "ghi", "DEF");
var_export($arr); echo "\n";
# =>
# array (
#   0 => 'abc',
#   1 => 'ghi',
#   2 => 'DEF',
# )

sort($arr);
var_export($arr); echo "\n";
# =>
# array (
#   0 => 'DEF',
#   1 => 'abc',
#   2 => 'ghi',
# )

usort($arr, function ($a, $b) {
  return strcasecmp($a, $b);
});
var_export($arr); echo "\n";
# =>
# array (
#   0 => 'abc',
#   1 => 'DEF',
#   2 => 'ghi',
# )

その他にもソートをするたくさんの関数がある。

sort 関数 | PHP Manual
http://php.net/manual/ja/function.sort.php

usort 関数 | PHP Manual
http://php.net/manual/ja/function.usort.php

配列のソート | PHP Manual
http://php.net/manual/ja/array.sorting.php

Python

# ソート済みのリストを返し、引数のリストは変更しない
sorted(lst)

# リスト自体をソートしたものに変更する破壊的メソッド
lst.sort()

sorted関数にはオプションを付けることでいろいろなソートができる。

ソート HOWTO | Python 2.7 documentation
http://docs.python.jp/2/howto/sorting.html

ソート HOWTO | Python 3 documentation
http://docs.python.jp/3/howto/sorting.html

Ruby / JRuby

Array#sort または破壊的なメソッド Array#sort! を使う。

# ソート済みの配列を返し、配列自身は変更しない
sortedArray = arr.sort

# 配列自体をソートしたものに変更する破壊的メソッド
arr.sort!

# ソート条件をブロックで指定
sortedArray = arr.sort  {|a, b| a.downcase <=> b.downcase}  # 非破壊的
arr.sort! {|a, b| a.downcase <=> b.downcase}  # 破壊的

arr = %w/abc ghi DEF/
p arr
# => ["abc", "ghi", "DEF"]

p arr.sort
# => ["DEF", "abc", "ghi"]

p arr.sort {|a, b| a.downcase <=> b.downcase}
# => ["abc", "DEF", "ghi"]

Array#sort, Array#sort! | Ruby 2.1 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.1.0/method/Array/i/sort.html

Enumerable#sort_by | Ruby 2.1 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.1.0/method/Enumerable/i/sort_by.html

Array#sort_by! | Ruby 2.1 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.1.0/method/Array/i/sort_by=21.html

Perl

sort(@arr)

ソートされた新しい配列を返し、引数の配列自体は変更しない。

sort { ... } @arr のように書くと中括弧の中のブロックを評価することで比較してくれる。ブロックの中では $a$b という2つの変数が特別に使えて、 $a の方がソート順で前に来るべきであれば負、後ろに来るべきであれば正の値をブロックから返すようにする。 ScalaのsortByと同じ使い方ができる。

my @arr = qw/abc defg hi/;
my @result = sort { length($a) <=> length($b) } @arr;
print "@result";
# => hi abc defg

中括弧のブロックを与えないと文字列の辞書順で比較するので、配列の要素が数値の場合はブロックを与える必要がある。

my @arr = qw/30 40 10 20/;
my @result = sort { $a <=> $b } @arr;
print "@result";
# => 10 20 30 40

ただこの方法だとブロックの中のlengthを同じ要素に対して何度も計算することになるので、 lengthでなくてもっと複雑な計算をすることになるとソートに時間がかかってしまう。その場合は以下のようにするとよい。

my @arr = qw/abc defg hi/;
my @result = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [$_, length($_)] } @arr;
print "@result";
# => hi abc defg

2行目は右から左へ、map, sort, map の順番で評価される。これはScalaのsortWithに使い方が似ている。

sort 関数 | perldoc.jp
http://perldoc.jp/func/sort

JavaScript

配列に sort() というメソッドがあるでこれを利用する。このメソッドは配列自体を変更する破壊的なメソッド。ただし数字をソートするには比較用の関数を渡してあげないといけない。

var arr = [3, 10, 1, 5];
console.log(arr.sort());
// [ 1, 10, 3, 5 ]
// 引数なしで sort() を呼び出すと、内容を文字列として比較してソートされる

console.log(arr);
// [ 1, 10, 3, 5 ]
// sort() は破壊的なメソッドなので、arr自体が変更されている

console.log(arr.sort(function(a, b){
    return a - b;
}));
// [ 1, 3, 5, 10 ]
// sort に比較関数を渡せばそれに従ってソートされる
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。