前回の続きです。
今回は名前、年齢をフィールドに持つUserというクラスのListを作り、複数条件を指定して並べ替えしてみます。
Userクラス
まずは並べ替えに使うためのmodelでUserクラスを作っていきます。
フィールドにid、名前、年齢を持ちます。
これらのフィールドをもとに並べ替えをしてみます。
public class User {
/* id */
private String id;
/* 名前 */
private String name;
/* 年齢 */
private int age;
public User(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
/**
* @return id
*/
public String getId() {
return id;
}
/**
* @param id セットする id
*/
public void setId(String id) {
this.id = id;
}
/**
* @return name
*/
public String getName() {
return name;
}
/**
* @param name セットする name
*/
public void setName(String name) {
this.name = name;
}
/**
* @return age
*/
public int getAge() {
return age;
}
/**
* @param age セットする age
*/
public void setAge(int age) {
this.age = age;
}
}
Mainクラス
ここからが本番です。
Mainクラスのmainメソッド内でUserのListを作成、comparatorSample()で実際に並べ替えの処理をしています。
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
//ユーザーリスト作成
List<User> users = Arrays.asList(
new User("1", "Alice", 30),
new User("2", "Bob", 25),
new User("3", "Alice", 25),
new User("4", "Charlie", 35)
);
//並べ替え実行
List<User> sortedPeople = comparatorSample(users);
//表示
sortedPeople.forEach(user ->
System.out.println("Name:" + user.getName() + " Age:" + user.getAge())
);
}
/**
* 名前でソートし、名前が同じなら年齢でソートする
* @param users
*/
public static List<User> comparatorSample(List<User> users) {
/*
* ①
* Comparator.comparingメソッドを使って、
* UserクラスのgetNameメソッドを基準にソートし、
* thenComparingメソッドを使って
* UserクラスのgetAgeメソッドを基準に追加のソート条件を指定。
*/
List<User> sortedPeople = users.stream()
.sorted(Comparator.comparing(User::getName)
.thenComparing(User::getAge))
.collect(Collectors.toList());
return sortedPeople;
}
}
①で書いてある通り、引数で受け取ったList<User>のusers.stream()でStreamを生成し、ソートの条件を書いていいます。
記載の通りチェーンして条件を付け足していくイメージです。
.sorted(Comparator.comparing(User::getName)
でgetNameの値で並べ替えをし、
.thenComparing(User::getAge))
でさらにgetAgeで並べ替えをしています。
最後に前回も使った
.collect(Collectors.toList());
でソート結果をListに収集するという順番です。
実行結果
Name:Alice Age:25
Name:Alice Age:30
Name:Bob Age:25
Name:Charlie Age:35
今回は以上です。
一言
複数条件のソートは自分で実装するとかなり面倒ですがStreamAPIをうまく使えば簡単に実装できます。
現場でも積極的に使っていきたい。
コメント