Java StreamAPIを使ってListをソートする②複数条件でのソート

※当サイトではアフィリエイト広告を利用しています
※当サイトではアフィリエイト広告を利用しています
Java

前回の続きです。

今回は名前、年齢をフィールドに持つ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をうまく使えば簡単に実装できます。

現場でも積極的に使っていきたい。

コメント

タイトルとURLをコピーしました