データを扱う開発者として必要な最も一般的な機能の 1 つは並べ替えです。データを並べ替えることができることで、アルゴリズムを最適化してより高速に実行でき、必要なデータをわずかな時間で見つけることができます。そうでなければかかるだろう。今日のレッスンでは、Java コレクションの sort() について説明します。簡単な思考実験として、大学の名簿から名前を検索していると想像してください。この学校には何万人もの生徒がいるかもしれません。与えられた名簿がアルファベット順ではなかった場合、探している名前を最終的に見つけるまで、すべてのページをめくって、どこにも名前を読み飛ばしていないことを確認するために非常に注意深く見る必要があります。一方、名簿がアルファベット順に並べられている場合は、検索の厳密性が低くなるだけでなく、しかし、同じ最初の文字を持つ名簿内のセクションに簡単にジャンプでき、探している人物にたどり着くまで、ページを大きく飛び回り続けることができます。扱うデータが増えるほど、それをできるだけ効果的かつ効率的に使用することが重要になります。この記事では、Collections sort メソッドを使用して Java の List 実装 (ArrayList を含む) を並べ替える方法について説明します。
Java コレクションの sort メソッドを使用して Java で ArrayList を並べ替える方法
Java Collections.sort メソッドについて話しましょう。java.util パッケージには、ArrayList など、開発者によってよく使用される多くの便利なユーティリティとパッケージが含まれています。次のような単純なプログラムがあるとします。
import java.util.*;
import java.io.*;
class Main{
public static void main(String[] args){
List<String> colors = new ArrayList<String>();
colors.add("Red ");
colors.add("Orange");
colors.add("Green");
colors.add("Blue");
}
}
カラーリストをアルファベット順に印刷できるようにしたいと考えています。どうすればこんなことができるでしょうか?java.util.Collections を使用すると、ワンライナーと同じくらい簡単にソートできます。
Collections.sort(colors);
タダ!これで、カラーリストが適切に並べ替えられました。リストを次のように印刷するとします。
System.out.println(colors);
すると、次の出力が得られます。
[Blue, Green, Orange, Red]
それはとても簡単でした?! Collections.sort() を使用して、整数、浮動小数点、またはその他の単純なデータ型のリストを昇順に並べ替えるのも同様に簡単です。しかし、降順に並べ替えたい場合はどうすればよいでしょうか? これが理にかなっている場合は確かにあります。特定のクラスのテストの得点のリストがあり、誰が最高得点の生徒であるかを把握したいと想像してください。探している答えが一番上に来るように、リストを降順 (スコアの高い順) に並べ替える方がはるかに合理的です。ありがたいことに、Collections.sort() はオプションの 2 番目のパラメーターで上書きされ、これにより次のことが可能になります。
sort(List l, Comparator c)
しかし、コンパレータとは何でしょうか? コンパレータは、2 つの入力を比較し、どちらの入力が最初に来るかを表す数値を返す単純な関数です。プリミティブ データ型の ArrayList をソートしている場合、Java Collections にはすでに reverseOrder() コンパレータが用意されています。次のように呼び出すことができます:
Collections.sort(colors, Collections.reverseOrder());
これで、色がその場で逆ソートされたため、印刷すると次の出力が得られます。
[Red, Orange, Green, Blue]
Java でコレクションを使用して非プリミティブ データ型を並べ替える方法
ここまで、Collections.sort()メソッドを使用して Java で文字列または int の ArrayList を並べ替えるのは、1 行のコードと同じくらい簡単であることがわかりました。ただし、多くの場合、ArrayList には非プリミティブ データ型が格納されます。より複雑な属性を持つデータを扱う場合は、これらのオブジェクトと、それらの属性を使用してオブジェクトを相互に比較する方法を表すクラスを作成する必要があります。この例を調べるために、色のリストを並べ替える例をもう一度見てみましょう。ただし、今回は、文字列を並べ替えるのではなく、Color オブジェクトを並べ替えます。基本的な Color クラスは次のようになります。
public class Color{
private int r;
private int g;
private int b;
private String name;
Color(String name, int red, int green, int blue){
this.name = name;
this.r = red;
this.g = green;
this.b = blue;
}
}
Color クラスを Collections.sort() と互換性を持たせ、Collections が Color オブジェクトの比較および並べ替え方法を理解できるようにするには、2 つの小さな変更を行う必要があります。
- Color を Comparable オブジェクトにする (Add は Comparable<Object> を実装します)
- クラスの CompareTo メソッドをオーバーライドします (override public int CompareTo(Object o))
public class Color implements Comparable<Object>{
private int r;
private int g;
private int b;
private String name;
Color(int red int green, int blue, String name){
this.r = red;
this.g = green;
this.b = blue;
this.name = name;
}
@Override
public int compareTo(Object o) {
Color c = (Color) o;
return this.name.compareTo(c.name);
}
}
Color の CompareTo メソッドは単に String の CompareTo メソッドを呼び出していることに注意してください。ソートはアルファベット順に行われます。たとえば、赤色の値で昇順に並べ替えたい場合は、return ステートメントを return this.r - cr; に置き換えることができます。(緑色の値で降順に並べ替えたい場合は、 return cg - this.g; になります)。さて、電話したら
Collections.sort(colors);
単なる文字列ではなく色の ArrayList の場合は、Collections が Color オブジェクトの比較方法を理解しているため、機能します。オブジェクトに Comparable<Object> を実装させたくない場合は、クラスのコンパレータを作成し、それを 2 パラメータの Collections.sort() メソッドに渡すこともできます。コンパレータはメソッド public int Compare(Object one, Object two) をオーバーライドし、Collections.sort() メソッドはこれを使用して並べ替え中にオブジェクトを比較します。SortByName コンパレータと SortByRed コンパレータの例を以下に実装します。
class SortByName implements Comparator<Color>
{
public int compare(Color a, Color b)
{
return a.name.compareTo(b.name);
}
}
class SortByRGB implements Comparator<Color>
{
public int compare(Color a, Color b)
{
return a.r - b.r;
}
}
これで電話できるようになりました
Collections.sort(colors, new SortByName());
Color クラスが実際に Comparable を実装していなくても、機能します。 場合によっては、これがラムダ関数を使用してインラインで実行されることがあります。ラムダ関数は本質的には、それを呼び出すコード行内で定義できる名前のない関数です。これらは、1 つの特定のインスタンスに対してのみ関数を呼び出す必要があり、別の場所に完全な別個の関数を定義したくない場合に便利です。SortByName コンパレータは、次のようにラムダ関数を使用してインラインで定義できます。
Collections.sort(colors, (a, b)-> {
return a.name.compareTo(b.name)});
ご想像のとおり、(a, b) はラムダ関数 (比較される 2 つのオブジェクト) のパラメーターを表します。-> は、その後にラムダ関数の定義があることを示します。それくらいです!これで、Collections パッケージを使用して Java で ArrayList を並べ替える最も一般的な方法がわかりました。
GO TO FULL VERSION