Java > Comparableでオブジェクトをソートする方法

更新日 2011-12-08
広告

Comparableインターフェースを利用して、オブジェクトを簡単にソートする方法を紹介します。

まず、ソートしたいクラスに Comparable インタフェースを実装します。 Comparableインターフェースは、compareToメソッドを持ちます。

例えば、人間を表す Human クラスを、年齢が若い順にソートしたいとします。 この場合、以下のようなサンプルになります。

public class Human implements Comparable<Human> {
    // 年齢
    private final int age;

    // 体重
    private final double weight;

    // コンストラクタ
    public Human(int age, double weight) {
    	this.age = age;
    	this.weight = weight;
    }

    public int getAge() {
    	return this.age;
    }

    public double getWeight() {
    	return this.weight;
    }

    @Override
    public int compareTo(Human otherHuman) {
    	if (this.age < otherHuman.getAge()) {
    	    return -1;
    	} else if (this.age >= otherHuman.getAge()) {
    	    return 1;
    	} else {
    	    return 0;
    	}
    }

    @Override
    public String toString() {
    	return "(" + this.age + ", " + this.weight + ")";
    }
}

compareToでは、Humanオブジェクト同士を比較します。 そして、自オブジェクト(this)を前にソートしたければマイナスの値を返すようにします。 逆に、後ろにソートしたければプラスの値を返すようにします。 今回は、「年齢が若い順にソートしたい」ので、this.ageが小さい場合にマイナスの値を返します。

それでは、Humanオブジェクトをソートしてみます。 一郎、二郎、三郎の三兄弟を、年齢が若い順にソートします。

import java.util.*;

public class ComparableTest {
    public static void main(String[] args) {
    	Human ichiro = new Human(15, 50.8); // 一郎は15歳
    	Human jiro = new Human(13, 43.2);   // 二郎は13歳
    	Human saburo = new Human(11, 40.7); // 三郎は11歳

    	System.out.println("Sort list");
    	List<Human> brothers = new ArrayList<Human>();
    	brothers.add(ichiro);
    	brothers.add(jiro);
    	brothers.add(saburo);

    	// リストをソート
    	Collections.sort(brothers);

    	for (Human human : brothers) {
    	    System.out.println("(age, weight) = " + human);
    	}

    	System.out.println("");
    	System.out.println("Sort array");
    	Human[] brotherArray = new Human[3];
    	brotherArray[0] = jiro;
    	brotherArray[1] = ichiro;
    	brotherArray[2] = saburo;

    	// 配列をソート
    	Arrays.sort(brotherArray);


    	for (Human human : brotherArray) {
    	    System.out.println("(age, weight) = " + human);
    	}

    }
}

このサンプルでは、リストをソートする処理と、配列をソートする処理を実装しています。 リストをソートする場合は Collections#sort メソッドを利用します。 配列をソートする場合は Arrays#sort メソッドを利用します。

ComparableTestを実行すると以下の結果になります。

Comparable$ java ComparableTest 
Sort list
(age, weight) = (11, 40.7)
(age, weight) = (13, 43.2)
(age, weight) = (15, 50.8)

Sort array
(age, weight) = (11, 40.7)
(age, weight) = (13, 43.2)
(age, weight) = (15, 50.8)
このように、年齢が若い順にソートされます。
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system