概要
表記の件、AtCoderの問題を解く時に必要になったのでメモ書きで残します。Javaで実装しようとした時にいくつか方法は挙げられると思いますが、個人的に一番短く書けると感じる実装を記載します。
対応方針
- Java: Sort an unmodifiable listに非破壊でListを返す実装方法がいくつか書いてありますが、今回はStream APIを使うものを採用します。
- 降順ソートは、Comparatorの使い方・作り方で紹介されている
reverseOrder()
を使います。
実装サンプル
下記のように入力する数字の数と、数字のリストを入力し、
4
2 2 1 3
入力した数字リストを降順に出力するサンプルです。
Sample.java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import static java.util.Comparator.reverseOrder;
public class Sample {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<Long> inputList = new ArrayList<Integer>();
for(int i = 0; i < n ;i++) {
inputList.add(sc.nextInt());
}
// ここがソートの該当箇所
List<Integer> sortedList = inputList.stream().sorted(reverseOrder()).collect(Collectors.toList());
for(int a: sortedList) {
System.out.println(a);
}
}
}
【2020/9/2追記】@swordoneさんからコメント頂きました。immutable保証まで行う場合はソート部分は下記のようになります。
List<Integer> sortedList = inputList.stream().sorted(reverseOrder())
.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));