Java:Collections.sort、Compartorのサンプル
Last-modified: 2013-09-20 (金) 11:27:14 (3843d)
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