トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Java:Collections.sort、Compartorのサンプル

Last-modified: 2013-09-20 (金) 11:27:14 (2189d)
Top / Java:Collections.sort、Compartorのサンプル

Java:Collections.sort、Compartorのサンプル

例えば、Stringのリストは以下のようにソートできます。

■コード

List<String> list = new ArrayList<String>();

list.add("yosida");
list.add("suzuki");
list.add("saitou");

Collections.sort(list);

for (String s : list) System.out.println(s);

■出力

saitou
suzuki
yosida

独自オブジェクトをソートしたい場合は、Comparatorクラスを継承したクラスを作成し、 Collections.sortメソッドに渡すとソートしてくれます。

サンプルコードは以下の通りです。

CustomSortSample?.java

package sample;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CustomSortSample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new CustomSortSample().runCoparatorSortSample();
	}
	
	public void runCoparatorSortSample(){
		
		List<TargetBean> list = new ArrayList<TargetBean>();
		
		// リストにソート対象を詰める
		list.add(new TargetBean().setName("suzuki").setAge(36));
		list.add(new TargetBean().setName("saitou").setAge(19));
		list.add(new TargetBean().setName("shimada").setAge(26));
		list.add(new TargetBean().setName("torii").setAge(79));
		list.add(new TargetBean().setName("yasuda").setAge(52));
		list.add(new TargetBean().setName("morimoto").setAge(26));
		list.add(new TargetBean().setName("shimada").setAge(26));
		
		// ソート前に出力
		System.out.println("###ソート前###");
		for (TargetBean i : list) {
			System.out.println(i);
		}
		
		// Conparatorを使ってソートを実行
		Collections.sort(list, new TargetBeanComparator());
		
		// ソート結果を出力
		System.out.println("###ソート後###");
		for (TargetBean i : list) {
			System.out.println(i);
		}
	}
	
	/**
	 * ソートしたいクラス
	 * 名前と年齢のBean
	 * 面倒だったので、setterでthisをreturnしている。
	 * */
	private class TargetBean{
		private String name = null;
		private int age = 0;

		public String getName() {
			return name;
		}
		
		public TargetBean setName(String name) {
			this.name = name;
			return this;
		}
		
		public int getAge() {
			return age;
		}
		
		public TargetBean setAge(int age) {
			this.age = age;
			return this;
		}
		
		public String toString(){
			return "name: " + this.name + "\tage: " + this.age;
		}
	}
	
	/**
	 * Comparatorクラス
	 * TargetBeanクラスのageを比較する
	 * */
	public class TargetBeanComparator implements Comparator<TargetBean>{
		
		// aとbを比較して、aの方が小さい場合は負の数を、等しい場合は0を
		// 大きい場合は正の数を返却する
		public int compare(TargetBean a, TargetBean b){
			// 年齢で比較して、aの方が大きい場合は正の数を返却する
			if (a.getAge() > b.getAge()){
				return 1;
			} else if (a.getAge() == b.getAge()){
				// 年齢が等しい場合、名前で比較し、aの方が後ろの場合に
				// 正の数を返却する。
				if (a.getName().compareTo(b.getName()) > 0){
					return 1;
				// aの方が前の場合に正の数を返却する。
				} else  if (a.getName().compareTo(b.getName()) < 0){
					return -1;
				// 名前も等しい場合は、0を返却する。
				} else {
					return 0;
				}
			}
			// それ以外の場合は、aの方が前として扱い、負の数を返却する。
			return -1;
		}
	}
}

■出力

###ソート前###
name: suzuki	age: 36
name: saitou	age: 19
name: shimada	age: 26
name: torii	age: 79
name: yasuda	age: 52
name: morimoto	age: 26
name: shimada	age: 26
###ソート後###
name: saitou	age: 19
name: morimoto	age: 26
name: shimada	age: 26
name: shimada	age: 26
name: suzuki	age: 36
name: yasuda	age: 52
name: torii	age: 79

なるほど、簡単ですなw