Java 入門

ホーム > コレクション > ArrayList 要素のソートと Comparator

ArrayList 要素のソートと Comparator

スポンサーリンク

ArrayList はその名の通りリストです。

何らかの要素 (オブジェクト) が数珠繋ぎに並んでいて、インデックスを使って配列のごとく特定の要素にアクセスできるというコレクションです。

今回はこの要素を何らかの条件に従って並び替えたい、ソートしたいという場合のことを考えます。

例えば整数の並び替えならば、大きなものから小さなものへとか、小さなものから大きなものへという風にソートされることは分かりやすいですね。

ですが、例えば「従業員オブジェクト」のリスト要素をソートする、という場合、何でソートするか自明ではありません。

従業員の年齢でソートするかもしれませんし、名前のあいうえお順で並び替えるかもしれません。

ここでは一般的に何らかのオブジェクトを要素にするリストを考え、それをソートする場合について説明します。

まずは、分かりやすい文字の並べ替え (ABC 順) からみてみましょう。

ArrayList 要素のソート

具体例で説明します。

ここでは String を要素とする ArrayList を用意し、それを並び替える方法を示します。

package com.keicode.java.test;

import java.util.ArrayList;
import java.util.Collections;

public class SortTest {
	public static void main(String[] args) {

		ArrayList<String> stateList = new ArrayList<String>();
		stateList.add("TX");
		stateList.add("WA");
		stateList.add("CA");

		for(int i=0;i<stateList.size();i++){
			System.out.println(stateList.get(i));
		}

		Collections.sort(stateList);
		System.out.println("--- Sorted ---");

		for(int i=0;i<stateList.size();i++){
			System.out.println(stateList.get(i));
		}

	}
}

ここではソート前の内容と、ソート後の内容を出力しています。

これの実行例は次の通りです。

TX
WA
CA
--- Sorted ---
CA
TX
WA

ABC 順で並び替えられていますね。

このように自然で自明な並び替えの場合、Collections.sort を呼べばたいていの場合デフォルトのソートで十分間に合います。

Collections.sort(...);

問題はもう少し複雑なオブジェクトのコレクションの場合です。

前述の通り、それぞれのオブジェクトの並び順などは自明ではないことが多いので、ソート順自体を定義しなければなりません。

Collections.sort は第二パラメータで Comparator オブジェクトを受け取り、カスタムのソート順を適用することが可能です。

さっそく、具体例です。

次のような Person (人) クラスを定義します。

package com.keicode.java.test;

public class Person {
	public int age;
	public String name;

	public Person(int age, String name){
		this.age = age;
		this.name = name;
	}
}

これを年齢 (age) を元にソートしたいという状況を考えます。

そこで次のような Comparator を定義します。

package com.keicode.java.test;

import java.util.Comparator;

public class PersonComparator implements Comparator<Person> {

	@Override
	public int compare(Person p1, Person p2) {
		return p1.age < p2.age ? -1 : 1;
	}
}

compare メソッドで、負の数、0、正の数 (int) を返すことによって、その大小を定義します。 第一引数を小さいとする場合は負の数。大きいとする場合は正の数を返せば OK です。

上記を次のように利用します。

package com.keicode.java.test;

import java.util.ArrayList;
import java.util.Collections;

public class SortTest {
	public static void main(String[] args) {

		ArrayList<Person> memberList = new ArrayList<Person>();
		memberList.add(new Person(40, "Hanako"));
		memberList.add(new Person(50, "Taro"));
		memberList.add(new Person(20, "Ichiro"));

		for(int i=0;i<memberList.size();i++){
			System.out.format("%s - %d\n",
				memberList.get(i).name,
				memberList.get(i).age);
		}

		Collections.sort(memberList, new PersonComparator());
		System.out.println("--- Sorted ---");

		for(int i=0;i<memberList.size();i++){
			System.out.format("%s - %d\n",
				memberList.get(i).name,
				memberList.get(i).age);
		}

	}
}

この実行結果は次の通り。

Hanako - 40
Taro - 50
Ichiro - 20
--- Sorted ---
Ichiro - 20
Hanako - 40
Taro - 50

確かに年齢順にソートされていますね。

スポンサーリンク
ホーム > コレクション > ArrayList 要素のソートと Comparator