【Java】オブジェクトのリストを特定の値でソートする方法

java

自作オブジェクトクラスのリストを特定の値(IDや金額等)でソートする方法を紹介します。
ソートは、java.util.Comparatorを使います。

java.util.Comparatorを使うと、どんなオブジェクトクラスでも、どんな値でも、色々な組み合わせでもソートすることが可能です。
個人的には非常に使い勝手のよい方法だと思います。
もちろん昇順・降順を指定することも出来ます。

[スポンサーリンク]

自作オブジェクトのリストをソートするプログラム

public class ObjectSort {

    /**
     * 自作のオブジェクト
     *
     */
    private static class Shop {
		private int id;
		private String name;
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
	}

    public static void main(String[] args) throws Exception {
    	Shop shop1 = new Shop();
    	shop1.setId(1);
    	shop1.setName("shop1");

    	Shop shop2 = new Shop();
    	shop2.setId(2);
    	shop2.setName("shop2");

    	List<Shop> shopList = new ArrayList<>();
    	shopList.add(shop1);
    	shopList.add(shop2);

    	// ソート処理
		Collections.sort(shopList, new Comparator<Shop>() {
			public static final int ASC = 1;   //昇順 (1.2.3....)
			public static final int DESC = -1; //降順 (3.2.1....)
			@Override
			public int compare(Shop o1, Shop o2) {
				int sortType = DESC;
				if (o1 == null && o2 == null) {  
					return 0;
				} else if (o1 == null) {  
					return 1 * sortType;
				} else if (o2 == null) {  
					return -1 * sortType;
				}
				return (o1.getId() - o2.getId()) * sortType; 
			}
		});

		System.out.println("ソート後の並び");
		for (Shop shop : shopList) {
			System.out.println("shop name : " + shop.getName());
		}
    }
}

実行結果

>実行結果
ソート後の並び
shop name : shop2
shop name : shop1

解説

ソートをするために、Comparatorをimplementsして、ソート用クラスを作ります。
サンプルソースでは、無名クラスを作りましたが、これでもOKです。

51行~57行目のNullチェックは必要です。
無かったら、リストが1つだけの時にエラーとなります。

43行目で昇順・降順を指定しています。
今回は、ShopオブジェクトのIDでソートをしていますが、他のフィールドでもソートは可能です。

さいごに

自作オブジェクトのソート処理は、減算(ID値とか)方法を間違えると、昇順・降順結果が反転してしまいます。
きちんとソート処理を理解して気をつけて使いましょう。
それでは!