Javaのコレクションのsort()メソッドを日本語で言い換えると、「Javaコレクションのソート()」です。
今日は、Javaのコレクションのソートメソッドについて見ていきます。Javaでコレクションを操作していると、データをソートする必要が非常によくあります。
Javaのコレクションをソートする (Java Korekushon sort)
JavaのCollectionsクラスは、LinkedListやArrayListなどのすべてのList実装をソートするために非常に便利なメソッドCollections.sort()を提供しています。Collections.sort()メソッドには2つのオーバーロードされたメソッドがあります。
-
- sort(List list): リストの要素を自然な順序で昇順に並べ替えます。
- sort(List list, Comparator c): コンパレータによって引き起こされる順序に従ってリストの要素を並べ替えます。
上記のメソッドのシグニチャはジェネリクスを使用していますが、ここでは読みやすさのために省略しました。これらのメソッドをどのように、いつ使用するかを一つずつ掘り下げていきましょう。
JavaのCollectionsクラスのsortメソッドは、Listオブジェクトをソートします。
String型のArrayListを考えてみましょう。
List<String> fruits = new ArrayList<String>();
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Banana");
fruits.add("Grape");
今、私たちはCollections.sort()を使用してソートします。
Collections.sort(fruits);
// Print the sorted list
System.out.println(fruits);
このプログラムの出力は次のようになります。
[Apple, Banana, Grape, Orange]
したがって、Collections.sort() は文字列のリストを辞書順でソートしていることがわかります。そして、何も返しません。もしカスタムオブジェクトのリストがある場合はどうでしょうか?もちろん、それらもソートすることができます。Fruitというクラスを考えてみましょう。
package com.scdev.collections;
public class Fruit{
private int id;
private String name;
private String taste;
Fruit(int id, String name, String taste){
this.id=id;
this.name=name;
this.taste=taste;
}
}
果物のリストを作りましょう。
List<Fruit> fruitList=new ArrayList<Fruit>();
Fruit apple=new Fruit(1, "Apple", "Sweet");
Fruit orange=new Fruit(2, "Orange", "Sour");
Fruit banana=new Fruit(4, "Banana", "Sweet");
Fruit grape=new Fruit(3, "Grape", "Sweet and Sour");
fruitList.add(apple);
fruitList.add(orange);
fruitList.add(banana);
fruitList.add(grape);
package com.scdev.collections;
public class Fruit implements Comparable<Object>{
private int id;
private String name;
private String taste;
Fruit(int id, String name, String taste){
this.id=id;
this.name=name;
this.taste=taste;
}
@Override
public int compareTo(Object o) {
Fruit f = (Fruit) o;
return this.id - f.id ;
}
}
Comparableを実装したので、エラーなくリストをソートすることができます。
Collections.sort(fruitList);
fruitList.forEach(fruit -> {
System.out.println(fruit.getId() + " " + fruit.getName() + " " +
fruit.getTaste());
});
出力は以下の通りになります。
1 Apple Sweet
2 Orange Sour
3 Grape Sweet and Sour
4 Banana Sweet
JavaのCollectionsクラスのsortメソッドは、引数としてリストとコンパレータを受け取ります。
自然な並び順とは異なるカスタムロジックを定義するためには、java.util.Comparatorインターフェースを実装し、sort()の第2引数としてインスタンスを渡すことができます。例えば、Fruitの「name」フィールドに基づいて順序を定義したい場合、Comparatorを実装し、そのcompare()メソッドに比較のロジックを記述する必要があります。
package com.scdev.collections;
class SortByName implements Comparator<Fruit> {
@Override
public int compare(Fruit a, Fruit b) {
return a.getName().compareTo(b.getName());
}
}
今、この比較器を使ってソートすることができます。 (Ima, kono hikaku-ki o tsukatte sōto suru koto ga dekimasu.)
Collections.sort(fruitList, new SortByName());
以下のように出力されます。
1 Apple Sweet
4 Banana Sweet
3 Grape Sweet and Sour
2 Orange Sour
新しいComparatorクラスを書く代わりに、ランタイムでソートロジックを提供するために、私たちはラムダ関数を使うこともできます。
Collections.sort(fruitList, (a, b) -> {
return a.getName().compareTo(b.getName());
});
JavaのCollections.reverseOrderを日本語で同義表現すると「JavaのCollectionsクラスのreverseOrderメソッド」となります。
デフォルトでは、Collection.sortは昇順で並べ替えを行います。要素を逆の順序でソートしたい場合は、以下のメソッドを使用することができます。
-
- reverseOrder():コレクションの要素の自然順序の逆を強制するComparatorを返します。
- reverseOrder(Comparator cmp):指定されたComparatorの逆順を強制するComparatorを返します。
以下は、両方の方法についての例です。
JavaのCollectionsクラスのreverseOrder()メソッドの使用例
Collections.sort(fruits, Collections.reverseOrder());
System.out.println(fruits);
果物を逆アルファベット順で出力します。
[Orange, Grape, Banana, Apple]
JavaのCollectionsクラスのreverseOrder(Comparator cmp)の例です。
Collections.sort(fruitList, Collections.reverseOrder(new SortByName()));
fruitList.forEach(fruit -> {
System.out.println(fruit.getId() + " " + fruit.getName() + " " +
fruit.getTaste());
});
出力:
2 Orange Sour
3 Grape Sweet and Sour
4 Banana Sweet
1 Apple Sweet
それがJava Collectionsのsort()メソッドとその例に関する全てです。 参考文献:APIドキュメント