Collections.sortでList要素をソートさせる

2009/01/30 14:31Update
TAGS: Jaav | List | リスト | ソート | 昇順 | 降順 | 並び替え | 並び順

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

参考資料


java.util.Collections API doc
java.util.Comparator API doc
Java List/ArrayListよくある使い方

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments