Collectionsインターフェースを利用してListを並び替える方法

# Collectionsインターフェースを利用してListを並び替える方法
今回はCollectionsインターフェースを利用してListを並び替える方法を紹介させて頂きます。    
___
## Comparatorインターフェースを利用して並び替える場合
基本データ型が入ったList内の要素を昇順で並び替える場合は  
` Collections.sort(List); `  
降順で並び替える場合は  
` Collections.sort(List,Collections.reverseOrder()); `  
を使用することでList内の要素を並び替える事ができますが  
オブジェクト（インスタンス）が入ったListをインスタンス変数を参照して並び替えるにはComparatorインターフェースのcompareメソッドを実装したクラスを自分で実装し、利用する必要があります。  
実際にCompareメソッドを実装し、利用してみたコードがこちらです。  

``` JAVA
class Fruit {
	private String name;
	private Integer price;
	public Fruit(String name,Integer price) {
		this.name = name;
		this.price = price;
	}
	public String getName() { return this.name; }
	public Integer getPrice() { return this.price; }
}

//インスタンス変数nameの昇順で並び替えを行う
class nameComparator implements Comparator<Fruit> {
	public int compare(Fruit fruit1,Fruit fruit2) {
		return fruit1.getName().compareTo(fruit2.getName());
	}
}

//インスタンス変数priceの昇順で並び替えを行う
class priceComparator implements Comparator<Fruit> {
	public int compare(Fruit fruit1,Fruit fruit2) {
		return fruit1.getPrice().compareTo(fruit2.getPrice());
	}
}

public class Main {
	public static void main(String[] args) {
		List<Fruit> fruitList = new ArrayList<>();
		//fruitListにFruitオブジェクトを追加
		fruitList.add(new Fruit("Orange",800));
		fruitList.add(new Fruit("Melon",2000));
		fruitList.add(new Fruit("Apple",300));
		fruitList.add(new Fruit("Grape",500));

		System.out.println("fruitListの中身");
		print(fruitList);
		System.out.println("");
		System.out.println("fruitListの中身(nameComparatorを利用してsort後)");
		Collections.sort(fruitList,new nameComparator());
		print(fruitList);
		System.out.println("");
		System.out.println("fruitListの中身(priceComparatorを利用してsort後)");
		Collections.sort(fruitList,new priceComparator());
		print(fruitList);

	}
	//List<Fruit>の要素のインスタンス変数を出力するメソッド
	public static void print(List<Fruit> fruitList) {
		for(Fruit fruit : fruitList) {
			System.out.println(fruit.getName() + " " + fruit.getPrice());
		}
	}
}
```
実行結果

```
fruitListの中身
Orange 800
Melon 2000
Apple 300
Grape 500

fruitListの中身(nameComparatorを利用してsort後)
Apple 300
Grape 500
Melon 2000
Orange 800

fruitListの中身(priceComparatorを利用してsort後)
Apple 300
Grape 500
Orange 800
Melon 2000
```
Fruitオブジェクトのname変数やprice変数の昇順で並び替える事ができました。  
降順で並び替える際は以下の様にcompareメソッド内で使用されているcompareToの引数を逆にして実装します。

``` JAVA
//昇順の場合
return fruit1.getPrice().compareTo(fruit2.getPrice());
//降順の場合
return fruit2.getPrice().compareTo(fruit1.getPrice());
```
___
## ラムダ式を利用してComparatorインターフェースを実装してみる
Comparatorインターフェースの実装を上記のコードのように実装してしまうとコードが長くなりやすく、ラムダ式を利用して実装する事で短くまとまったコードになるためより良いと思います。  
ラムダ式を利用してコードを書き直した場合。

``` JAVA
class Fruit {
	private String name;
	private Integer price;
	public Fruit(String name,Integer price) {
		this.name = name;
		this.price = price;
	}
	public String getName() { return this.name; }
	public Integer getPrice() { return this.price; }
}

public class Main {
	public static void main(String[] args) {
		List<Fruit> fruitList = new ArrayList<>();
		//fruitListにFruitオブジェクトを追加
		fruitList.add(new Fruit("Orange",800));
		fruitList.add(new Fruit("Melon",2000));
		fruitList.add(new Fruit("Apple",300));
		fruitList.add(new Fruit("Grape",500));

		System.out.println("fruitListの中身");
		print(fruitList);
		System.out.println("");
		System.out.println("fruitListの中身(name変数でsort後)");
		Collections.sort(fruitList,(fruit1,fruit2) -> fruit1.getName().compareTo(fruit2.getName()));
		print(fruitList);
		System.out.println("");
		System.out.println("fruitListの中身(price変数でsort後)");
		Collections.sort(fruitList,(fruit1,fruit2) -> fruit1.getPrice().compareTo(fruit2.getPrice()));
		print(fruitList);

	}
	//List<Fruit>の要素のインスタンス変数を出力するメソッド
	public static void print(List<Fruit> fruitList) {
		for(Fruit fruit : fruitList) {
			System.out.println(fruit.getName() + " " + fruit.getPrice());
		}
	}
}
```
実行結果はラムダ式を使用せずに記述した場合と同じなので割愛します。  
ラムダ式を利用することでComparatorインターフェイスの実装が短くまとまりました。
___
## まとめ
* オブジェクトを入れたListを並び替える場合はComparatorインターフェースの実装クラスを作成し、sortメソッドで利用する。  
* ラムダ式を利用することでComparatorの実装を短くまとめられる。