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]