配列(リスト)をソートするには (sort / sortBy / sorted / sortWith) 2016/05/21
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));
sortedList = lst.sorted;
// 比較する値を指定
sortedList = lst.sortBy(_.toLowerCase);
// 比較方法を指定
sortedList = lst.sortWith((str1, str2) => str1.compareToIgnoreCase(str2) < 0);
sort($arr);
// 比較方法を指定
usort($arr, function ($a, $b) {
return strcasecmp($a, $b);
});
sortedList = sorted(lst)
// リスト自身を変更する方法
lst.sort()
sortedArray = arr.sort
# 配列自身を変更する方法
arr.sort!
# 比較方法を指定
sortedArray = arr.sort {|a, b| a.downcase <=> b.downcase}
arr.sort!{|a, b| a.downcase <=> b.downcase}
Java 2016/05/22
Signature:
void java.util.Arrays.sort(Object[] arr)
-
<T> void java.util.Arrays.sort(T[] arr, Comparator<? super T> c)
void <T extends java.util.Comparable<? super T>> java.util.Collections.sort(java.util.List<T> list)
void <T> java.util.Collections.sort(List<T> list, java.util.Comparator<? super T> comparator)
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 2016/04/18
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 2016/05/21
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 2014/09/07
# ソート済みのリストを返し、引数のリストは変更しない
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 2016/05/21
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 2015/10/14
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 2013/10/25
配列に 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 に比較関数を渡せばそれに従ってソートされる