サイトアイコン JavaCodeList~逆引き~

【Java逆引き】Listの要素をSortするサンプルコード

JavaでListを扱う際に、その要素をソートすることが必要な場合があります。
JavaでListをソートする方法は1つではなく、何種類かのメソッドを利用した方法があります。
今回はListをソートするサンプルコードの一例を紹介したいと思います。

前提

環境

Java version:Java SE 1.8

サンプルコードで利用するBeanクラス

public class Person {

	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public Person() {
	}

	public String getName() {
		return this.name;
	}

	public int getAge() {
		return this.age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "name:" + getName() + " age:" + getAge();
	}
}

サンプルコード

■List.sortを利用してソートする方法1

	/*
	 * List.sortを利用してComparatorを実装していない独自クラスのListをソートする
	 */
	private static void ptn1() {

		System.out.println("■List.sort:Comparatable を実装していない独自クラスのListをソートする");
		List<Person> personList = new ArrayList<Person>();
		personList = new ArrayList<Person>();
		personList.add(new Person("SABURO", 9));
		personList.add(new Person(null, 8));
		personList.add(new Person("AAA", 20));
		personList.add(new Person("BBB", 35));
		personList.add(new Person("CCC", 10));

		// ソート1
		personList.sort(Comparator.comparing(Person::getName, Comparator.nullsLast(Comparator.naturalOrder())));
		System.out.println("Nameフィールドを昇順でソートする。nullのキーは末尾");
		System.out.println(personList);

		// ソート2
		personList.sort(Comparator.comparing(Person::getAge, Comparator.reverseOrder()));
		System.out.println("Ageフィールドを降順でソートする。");
		System.out.println(personList);

		// Comparatorクラスのメソッドで自然順「naturalOrder()」、逆順「reverseOrder()」、
		// null末尾「nullsLast()」、null先頭「reverseOrder()」でそれぞれComparatorが取得できる。
	}
<実行結果>
■List.sort:Comparatable を実装していない独自クラスのListをソートする
Nameフィールドを昇順でソートする。nullのキーは末尾
[name:AAA age:20, name:BBB age:35, name:CCC age:10, name:SABURO age:9, name:null age:8] Ageフィールドを降順でソートする。
[name:BBB age:35, name:AAA age:20, name:CCC age:10, name:SABURO age:9, name:null age:8]

■List.sortを利用してソートする方法2

	/*
	 * List.sortを利用してComparatorを実装しているクラスのListをソートする
	 */
	private static void ptn2() {

		System.out.println("■List.sort:Comparatable を実装しているクラスのListをソートする");
		List<Integer> personList = new ArrayList<Integer>();
		personList = new ArrayList<Integer>();
		personList.add(3);
		personList.add(2);
		personList.add(1);
		personList.add(null);
		personList.add(4);

		// ソート1
		personList.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
		System.out.println("昇順でソートする。nullのキーは先頭");
		System.out.println(personList);

		// ソート2
		personList.sort(Comparator.nullsLast(Comparator.reverseOrder()));
		System.out.println("降順でソートする。nullのキーは末尾");
		System.out.println(personList);
	}
<実行結果>
■List.sort:Comparatable を実装しているクラスのListをソートする
昇順でソートする。nullのキーは先頭
[null, 1, 2, 3, 4] 降順でソートする。nullのキーは末尾
[4, 3, 2, 1, null]

■List.sortを利用してソートする方法3

	/*
	 * List.sortを利用してStringのListをソートする
	 */
	private static void ptn3() {

		System.out.println("■List.sort:StringのListをソートする");
		List<String> personList = new ArrayList<String>();
		personList = new ArrayList<String>();
		personList.add("SABURO");
		personList.add("TARO");
		personList.add("JIRO");
		personList.add(null);
		personList.add("AAA");
		personList.add("CCC");
		personList.add("BBB");

		//ソート1
		personList.sort(Comparator.nullsFirst(Comparator.reverseOrder()));
		System.out.println("降順でソートする。nullは先頭");
		System.out.println(personList);

		//ソート2
		personList.sort(Comparator.nullsLast(Comparator.naturalOrder()));
		System.out.println("昇順でソートする。nullは末尾");
		System.out.println(personList);

		//ソート3
		// 複数の条件でキーでソートするにはthenComparing()を使用する。
		// 文字列リストを長さでソートし、同じ長さなら文字列の逆順でソートする場合
		personList.sort(Comparator.nullsLast(Comparator.comparing(String::length).thenComparing(Comparator.reverseOrder())));
		System.out.println("文字列の長さでソート、同じ長さなら逆順でソートする。nullは末尾");
		System.out.println(personList);

	}
<実行結果>
■List.sort:StringのListをソートする
降順でソートする。nullは先頭
[null, TARO, SABURO, JIRO, CCC, BBB, AAA] 昇順でソートする。nullは末尾
[AAA, BBB, CCC, JIRO, SABURO, TARO, null] 文字列の長さでソート、同じ長さなら逆順でソートする。nullは末尾
[CCC, BBB, AAA, TARO, JIRO, SABURO, null]

■streamを利用してソートする方法

	/*
	 * stream()を利用してComparatable を実装していない独自クラスのListをソートする
	 */
	private static void ptn4() {

		System.out.println("■stream:Comparatable を実装していない独自クラスのListをソートする");
		List<Person> personList = new ArrayList<Person>();
		personList = new ArrayList<Person>();
		personList.add(new Person("SABURO", 9));
		personList.add(new Person("TARO", 21));
		personList.add(new Person("JIRO", 15));
		personList.add(new Person("AAA", 20));
		personList.add(new Person("BBB", 35));
		personList.add(new Person("CCC", 9));

		List<Person> personSortedList = personList.stream()
				// 全てのListの子要素にファクトリメソッドを適用
				.sorted(Comparator.comparing(Person::getName))
				// Listで集計する
				.collect(Collectors.toList());
		System.out.println("Nameフィールドを昇順でソートする。");
		System.out.println(personSortedList);

	}
<実行結果>
■stream:Comparatable を実装していない独自クラスのListをソートする
Nameフィールドを昇順でソートする。
[name:AAA age:20, name:BBB age:35, name:CCC age:9, name:JIRO age:15, name:SABURO age:9, name:TARO age:21]

■Collections.sort()を利用してソートする方法

	/*
	 * Collections.sort()を利用してComparatable を実装しているクラスのListをソートする
	 */
	private static void ptn5() {

		System.out.println("■Collections.sort():Comparatable を実装しているクラスのListをソートする");
		List<Integer> list = new ArrayList<Integer>();
		Collections.addAll(list, 3, 2, 1, 4, 5);

		//ソート1
		Collections.sort(list);
		System.out.println("昇順でソートする。");
		System.out.println(list);

		//ソート2
		Collections.sort(list, Comparator.reverseOrder());
		System.out.println("降順でソートする。");
		System.out.println(list);

		//ソート3
		list.sort(Comparator.naturalOrder());
		System.out.println("昇順でソートする。");
		System.out.println(list);
	}
<実行結果>
■Collections.sort():Comparatable を実装しているクラスのListをソートする
昇順でソートする。
[1, 2, 3, 4, 5] 降順でソートする。
[5, 4, 3, 2, 1] 昇順でソートする。
[1, 2, 3, 4, 5]

↓↓↓少しは参考になったかなぁ、と思った方はこちらのボタンをポチっとお願いします。

モバイルバージョンを終了