List

Java – クラスを持つArrayListをソートする方法を解説 – 自作クラスArrayListのソート

Javaで自作クラスを持つArrayListをソートするには、Comparableインターフェースを実装するか、Comparatorを使用します。

Comparableを使用する場合、クラス内でcompareToメソッドをオーバーライドし、ソート基準を定義します。

一方、Comparatorを使用する場合は、外部でソートロジックを記述し、Collections.sortList.sortメソッドに渡します。

ArrayListと自作クラスの基本

JavaのArrayListは、可変長の配列を実現するためのクラスで、要素の追加や削除が容易に行えます。

自作クラスをArrayListに格納することで、オブジェクトの集合を管理することができます。

以下に、ArrayListと自作クラスの基本的な使い方を解説します。

ArrayListの基本的な使い方

  • 要素の追加: add()メソッドを使用して要素を追加します。
  • 要素の取得: get()メソッドを使用して特定のインデックスの要素を取得します。
  • 要素の削除: remove()メソッドを使用して要素を削除します。

自作クラスの定義

自作クラスを作成する際は、クラスのフィールドやメソッドを定義します。

以下は、簡単な自作クラスの例です。

// App.java
import java.util.ArrayList;
class Person {
    String name; // 名前
    int age;     // 年齢
    // コンストラクタ
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 情報を表示するメソッド
    void displayInfo() {
        System.out.println("名前: " + name + ", 年齢: " + age);
    }
}
public class App {
    public static void main(String[] args) {
        // ArrayListの作成
        ArrayList<Person> personList = new ArrayList<>(); 
        // 要素の追加
        personList.add(new Person("山田太郎", 25)); 
        personList.add(new Person("佐藤花子", 30)); 
        // 要素の表示
        for (Person person : personList) {
            person.displayInfo(); 
        }
    }
}

このコードでは、Personという自作クラスを定義し、nameageというフィールドを持っています。

ArrayListPersonオブジェクトを追加し、各オブジェクトの情報を表示しています。

名前: 山田太郎, 年齢: 25
名前: 佐藤花子, 年齢: 30

このように、ArrayListを使用することで、自作クラスのオブジェクトを簡単に管理し、操作することができます。

Comparableを使用したソート方法

Javaでは、Comparableインターフェースを実装することで、オブジェクトの自然順序を定義し、ArrayListを簡単にソートすることができます。

Comparableを実装したクラスは、compareToメソッドをオーバーライドする必要があります。

このメソッドは、オブジェクトの比較を行い、順序を決定します。

Comparableインターフェースの実装

以下に、PersonクラスにComparableインターフェースを実装し、年齢でソートする例を示します。

// App.java
import java.util.ArrayList;
import java.util.Collections;
class Person implements Comparable<Person> {
    String name; // 名前
    int age;     // 年齢
    // コンストラクタ
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 年齢で比較するメソッド
    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age); // 年齢で比較
    }
    // 情報を表示するメソッド
    void displayInfo() {
        System.out.println("名前: " + name + ", 年齢: " + age);
    }
}
public class App {
    public static void main(String[] args) {
        // ArrayListの作成
        ArrayList<Person> personList = new ArrayList<>(); 
        // 要素の追加
        personList.add(new Person("山田太郎", 25)); 
        personList.add(new Person("佐藤花子", 30)); 
        personList.add(new Person("鈴木一郎", 20)); 
        // ソート前の表示
        System.out.println("ソート前:");
        for (Person person : personList) {
            person.displayInfo(); 
        }
        // ソート
        Collections.sort(personList); 
        // ソート後の表示
        System.out.println("\nソート後:");
        for (Person person : personList) {
            person.displayInfo(); 
        }
    }
}
ソート前:
名前: 山田太郎, 年齢: 25
名前: 佐藤花子, 年齢: 30
名前: 鈴木一郎, 年齢: 20
ソート後:
名前: 鈴木一郎, 年齢: 20
名前: 山田太郎, 年齢: 25
名前: 佐藤花子, 年齢: 30

このコードでは、PersonクラスがComparableインターフェースを実装し、compareToメソッドで年齢を基準に比較しています。

Collections.sort()メソッドを使用することで、ArrayList内のPersonオブジェクトを年齢順にソートしています。

Comparatorを使用したソート方法

Comparatorインターフェースを使用すると、オブジェクトの比較方法を柔軟に定義でき、複数の基準でソートを行うことが可能です。

Comparatorを実装したクラスを作成するか、無名クラスやラムダ式を使用して、特定のソート基準を指定します。

Comparatorインターフェースの実装

以下に、Personクラスを年齢だけでなく名前でもソートできるように、Comparatorを使用した例を示します。

// App.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Person {
    String name; // 名前
    int age;     // 年齢
    // コンストラクタ
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 情報を表示するメソッド
    void displayInfo() {
        System.out.println("名前: " + name + ", 年齢: " + age);
    }
}
public class App {
    public static void main(String[] args) {
        // ArrayListの作成
        ArrayList<Person> personList = new ArrayList<>(); 
        // 要素の追加
        personList.add(new Person("山田太郎", 25)); 
        personList.add(new Person("佐藤花子", 30)); 
        personList.add(new Person("鈴木一郎", 20)); 
        personList.add(new Person("田中二郎", 25)); 
        // 年齢でソート
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return Integer.compare(p1.age, p2.age); // 年齢で比較
            }
        });
        // 年齢でソート後の表示
        System.out.println("年齢でソート後:");
        for (Person person : personList) {
            person.displayInfo(); 
        }
        // 名前でソート
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return p1.name.compareTo(p2.name); // 名前で比較
            }
        });
        // 名前でソート後の表示
        System.out.println("\n名前でソート後:");
        for (Person person : personList) {
            person.displayInfo(); 
        }
    }
}
年齢でソート後:
名前: 鈴木一郎, 年齢: 20
名前: 山田太郎, 年齢: 25
名前: 田中二郎, 年齢: 25
名前: 佐藤花子, 年齢: 30
名前でソート後:
名前: 佐藤花子, 年齢: 30
名前: 鈴木一郎, 年齢: 20
名前: 山田太郎, 年齢: 25
名前: 田中二郎, 年齢: 25

このコードでは、Comparatorを使用して、Personオブジェクトを年齢でソートした後、名前でソートしています。

Collections.sort()メソッドにComparatorを渡すことで、異なる基準でのソートが可能になります。

これにより、柔軟なソートが実現できます。

Collections.sortとList.sortの違い

Javaには、リストをソートするための2つの主要なメソッドがあります。

それはCollections.sort()List.sort()です。

これらは似たような機能を持っていますが、いくつかの重要な違いがあります。

以下に、それぞれのメソッドの特徴と違いを解説します。

Collections.sort()

  • クラス: Collectionsクラスの静的メソッド
  • 引数: ソート対象のリストと、オプションでComparatorを指定可能
  • 戻り値: なし(リストが直接変更される)
  • 使用例: リストをソートする際に、Collections.sort(list)のように使用します。

List.sort()

  • クラス: Listインターフェースのデフォルトメソッド
  • 引数: オプションでComparatorを指定可能
  • 戻り値: なし(リストが直接変更される)
  • 使用例: リストのインスタンスでlist.sort(comparator)のように使用します。

主な違い

特徴Collections.sort()List.sort()
定義Collectionsクラスの静的メソッドListインターフェースのデフォルトメソッド
使用方法リストを引数に取るリストのインスタンスで呼び出す
可読性やや冗長より直感的
JavaバージョンJava 1.2から利用可能Java 8から利用可能

以下に、Collections.sort()List.sort()の使用例を示します。

// App.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Person {
    String name; // 名前
    int age;     // 年齢
    // コンストラクタ
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 情報を表示するメソッド
    void displayInfo() {
        System.out.println("名前: " + name + ", 年齢: " + age);
    }
}
public class App {
    public static void main(String[] args) {
        // ArrayListの作成
        List<Person> personList = new ArrayList<>(); 
        // 要素の追加
        personList.add(new Person("山田太郎", 25)); 
        personList.add(new Person("佐藤花子", 30)); 
        personList.add(new Person("鈴木一郎", 20)); 
        // Collections.sort()を使用して年齢でソート
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return Integer.compare(p1.age, p2.age); // 年齢で比較
            }
        });
        // ソート後の表示
        System.out.println("Collections.sort()によるソート結果:");
        for (Person person : personList) {
            person.displayInfo(); 
        }
        // List.sort()を使用して名前でソート
        personList.sort(new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return p1.name.compareTo(p2.name); // 名前で比較
            }
        });
        // ソート後の表示
        System.out.println("\nList.sort()によるソート結果:");
        for (Person person : personList) {
            person.displayInfo(); 
        }
    }
}
Collections.sort()によるソート結果:
名前: 鈴木一郎, 年齢: 20
名前: 山田太郎, 年齢: 25
名前: 佐藤花子, 年齢: 30
List.sort()によるソート結果:
名前: 佐藤花子, 年齢: 30
名前: 鈴木一郎, 年齢: 20
名前: 山田太郎, 年齢: 25

このように、Collections.sort()List.sort()は、リストをソートするための異なる方法ですが、どちらも効果的に使用できます。

選択は、コードの可読性や好みによるものです。

実践例:自作クラスのArrayListをソートする

ここでは、Personクラスを使用して、ArrayListに格納されたオブジェクトを年齢と名前の両方でソートする実践例を示します。

この例を通じて、ComparableComparatorの両方の方法を使ったソートを実演します。

自作クラスの定義

まず、Personクラスを定義します。

このクラスには、名前と年齢のフィールドがあり、情報を表示するメソッドも含まれています。

// App.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Person {
    String name; // 名前
    int age;     // 年齢
    // コンストラクタ
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 情報を表示するメソッド
    void displayInfo() {
        System.out.println("名前: " + name + ", 年齢: " + age);
    }
}

年齢でソート

次に、Comparableインターフェースを実装して、年齢でソートする方法を示します。

compareToメソッドをオーバーライドして、年齢を基準に比較します。

// 年齢でソートするためにComparableを実装
class PersonComparable implements Comparable<PersonComparable> {
    String name; // 名前
    int age;     // 年齢
    // コンストラクタ
    PersonComparable(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 年齢で比較するメソッド
    @Override
    public int compareTo(PersonComparable other) {
        return Integer.compare(this.age, other.age); // 年齢で比較
    }
    // 情報を表示するメソッド
    void displayInfo() {
        System.out.println("名前: " + name + ", 年齢: " + age);
    }
}

名前でソート

次に、Comparatorを使用して、名前でソートする方法を示します。

無名クラスを使って、Comparatorを定義します。

public class App {
    public static void main(String[] args) {
        // ArrayListの作成
        ArrayList<PersonComparable> personList = new ArrayList<>(); 
        // 要素の追加
        personList.add(new PersonComparable("山田太郎", 25)); 
        personList.add(new PersonComparable("佐藤花子", 30)); 
        personList.add(new PersonComparable("鈴木一郎", 20)); 
        personList.add(new PersonComparable("田中二郎", 25)); 
        // 年齢でソート
        Collections.sort(personList); 
        // 年齢でソート後の表示
        System.out.println("年齢でソート後:");
        for (PersonComparable person : personList) {
            person.displayInfo(); 
        }
        // 名前でソート
        Collections.sort(personList, new Comparator<PersonComparable>() {
            @Override
            public int compare(PersonComparable p1, PersonComparable p2) {
                return p1.name.compareTo(p2.name); // 名前で比較
            }
        });
        // 名前でソート後の表示
        System.out.println("\n名前でソート後:");
        for (PersonComparable person : personList) {
            person.displayInfo(); 
        }
    }
}
年齢でソート後:
名前: 鈴木一郎, 年齢: 20
名前: 山田太郎, 年齢: 25
名前: 田中二郎, 年齢: 25
名前: 佐藤花子, 年齢: 30
名前でソート後:
名前: 佐藤花子, 年齢: 30
名前: 鈴木一郎, 年齢: 20
名前: 山田太郎, 年齢: 25
名前: 田中二郎, 年齢: 25

この実践例では、Personクラスを使用してArrayListを作成し、年齢でソートした後、名前でソートしています。

Comparableを使った年齢のソートと、Comparatorを使った名前のソートの両方を示すことで、Javaにおけるオブジェクトのソート方法を理解することができます。

まとめ

この記事では、JavaにおけるArrayListと自作クラスの基本的な使い方から、ComparableComparatorを用いたソート方法までを詳しく解説しました。

これにより、オブジェクトの集合を効率的に管理し、必要に応じて柔軟にソートする技術を身につけることができるでしょう。

次のステップとして、実際のプロジェクトでこれらの技術を活用し、より複雑なデータ構造やアルゴリズムに挑戦してみてください。

関連記事

Back to top button