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

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

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

*Java:Collections.sort、Compartorのサンプル [#x49abbc3]

例えば、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