Collections.sortでList要素をソートさせる
2009/01/30 14:31Update
Javaでは、java.util.Collections.sortメソッドで順序を持っているListの要素をソートすることができます。
Collections.sortメソッドの概要
java.util.Collections
static void sort(List list)
要素の「自然順序付け」に従って、指定されたリストを昇順にソートします。
static void sort(List list, Comparator c)
指定されたコンパレータが示す順序に従って、指定されたリストをソートします。
単なる昇順でソートを行う場合、Comparatorインタフェースを実装しなくてもよいが、ソートのカスタマイズもしくは降順などでソートを行いたい場合、java.util.Comparatorの実装クラスを用意する必要があります。
本文は、ソートのカスタマイズおよび昇順・降順のソートの実装方法について学びます。
List要素をソートする手順
1)何をソートしたいかを決めます
①ソート対象となる要素の型はStringかIntegerか、または自前のクラスBean?
②クラスBeanの場合、何のフィールドを比較する?
③昇順?降順?
2)Comparatorを継承したクラスを実装します
例:
public class MyComparator implements Comparator {
public int compare(Object arg0, Object arg1) {
return 1; //0:等しい。1:より大きい。-1:より小さい
}
}
3)ソートを行います
Collections.sort(list, new MyComparator(...));
サンプル
package com.test.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestCollectionsSort {
public static void main(String []args) {
List <String>strList4sort = new ArrayList<String>();
strList4sort.add("Car");
strList4sort.add("Air");
strList4sort.add("Box");
strList4sort.add("Do");
//ソート(デフォルト:昇順)
//Collections.sort(strList4sort); これもOK
Collections.sort(strList4sort, new StringComparator());
//ソート後の値
System.out.println("*************ソート後の値:***************");
for (String value : strList4sort) {
System.out.println(value);
}
//ソート(降順)
Collections.sort(strList4sort, new StringComparator(StringComparator.DESC));
//ソート後の値
System.out.println("*************ソート後の値:***************");
for (String value : strList4sort) {
System.out.println(value);
}
}
}
//Comparator実装クラス
class StringComparator implements Comparator {
public static final int ASC = 1; //昇順
public static final int DESC = -1; //降順
private int sort = ASC; //デフォルトは昇順
public StringComparator() {
}
/**
* @param sort StringComparator.ASC | StringComparator.DESC。昇順や降順を指定します。
*/
public StringComparator(int sort) {
this.sort = sort;
}
public int compare(Object arg0, Object arg1) {
if (!(arg0 instanceof Comparable) || !(arg1 instanceof Comparable)) {
throw new IllegalArgumentException("arg0 & arg1 must implements interface of java.lang.Comparable.");
}
if (arg0 == null && arg1 == null) {
return 0; // arg0 = arg1
} else if (arg0 == null) {
return 1 * sort; // arg1 > arg2
} else if (arg1 == null) {
return -1 * sort; // arg1 < arg2
}
return ((Comparable)arg0).compareTo((Comparable)arg1) * sort;
}
}
実行
c:\javac com/test/sort/TestCollectionsSort.java
c:\java com.test.sort.TestCollectionsSort
*************ソート後の値:***************
Air
Box
Car
Do
*************ソート後の値:***************
Do
Car
Box
Air
c:\java com.test.sort.TestCollectionsSort
*************ソート後の値:***************
Air
Box
Car
Do
*************ソート後の値:***************
Do
Car
Box
Air
参考資料
java.util.Collections API doc
java.util.Comparator API doc
Java List/ArrayListよくある使い方
Sponsored Link
- Relative Articles
- Javaコレクション・フレームワーク概要 - (2008/10/21 18:27)
- Java List/ArrayListよくある使い方 - (2009/01/30 13:02)
- Java List - 要素の削除方法及び要素の削除注意点 - (2010/06/03 15:18)
- List.toArray()/toArray(T []arg0) - Listから配列への変換例 - (2010/06/09 18:25)
- File.listFiles/FileFilterでファイル選別 - (2009/03/23 18:20)
- Javaサーブレットリスナー | ServletContextListener実装 - Webアプリの初期化処理 - (2009/08/12 18:11)
- Java+Tomcatでタスクを定期的に実行する方法 実装一例 - (2011/11/10 19:21)
- Java JVMオプション一覧 - (2009/06/29 14:54)