LoginSignup
38
30

More than 5 years have passed since last update.

Comparatorを使ってListをソートする方法

Last updated at Posted at 2017-12-04

Java 8において、Listのソート方法を整理します。

Java 7 and below

Java 7時代のおさらい

List<String> nameList = Arrays.asList("Takahashi", "Tanaka", "Suzuki");
Collections.sort(nameList);

Java 8以降

Java 8以降は、Listにsort(Comparator)が追加され、それを使ってリストをソートすることができます。

nameList.sort(Comparator.comparingInt(String::length));

複数条件(文字列長 -> アルファベットの順)でソートする。
thenComparing()を利用することで、ソート条件を追加できます。

nameList.sort(Comparator.comparingInt(String::length)
    .thenComparing(Comparator.naturalOrder()));

また、Streamが導入されることにより、Stream#sortedでリストをソースすることができます。

List<String> sortedList = nameList.stream().sorted()
        .collect(Collectors.toList());

Lambdaの利用

文字列長でソートする。

List<String> sortedList = nameList.stream().sorted((s1, s2) -> s1.length() - s2.length())
        .collect(Collectors.toList());

アルファベット順でソートする。

List<String> sortedList = nameList.stream().sorted((s1, s2) -> s1.compareTo(s2))
        .collect(Collectors.toList())

Comparatorの利用

文字列長でソートする。

List<String> sortedList = nameList.stream().sorted(
        Comparator.comparingInt(String::length)).collect(Collectors.toList());

アルファベット順でソートする。

List<String> sortedList = nameList.stream().sorted(
        Comparator.naturalOrder()).collect(Collectors.toList())

Comparatorで複数条件のソート

文字列長 -> アルファベットの順でソートする。
thenComparing()を利用することで、ソート条件を追加できます。

List<String> sortedList = nameList.stream().sorted(
        Comparator.comparingInt(String::length)
        .thenComparing(Comparator.naturalOrder())).collect(Collectors.toList());

Comparatorでオブジェクトリストのソート

List<Person> sortedList = personList.stream().sorted(new Comparator<Person>(){

    @Override
    public int compare(Person o1, Person o2) {
        return o1.getName().compareTo(o2.getName());
    }

}).collect(Collectors.toList());
38
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
30