📊
並び替え(配列ORリスト)x(降順OR昇順)
Javaの配列(例:int[]
)や、リスト(例:ArrayList<Integer>
)の並び替えの方法をまとめてみる。全体を試したコードは下に。
前提
配列とリストの作成
並び替えの対象は、以下のコードで作成されたものとする。
int[] intary = new int[10];
ArrayList<Integer> intlist = new ArrayList<>();
for(int i = 0; i<10; i++){
intary[i] = (int)(Math.random()*100);
intlist.add((int)(Math.random()*100));
}
System.out.println(Arrays.toString(intary));
// [42, 33, 20, 17, 38, 95, 29, 47, 40, 4]
System.out.println(intlist);
// [26, 44, 47, 68, 86, 63, 97, 53, 28, 16]
基本:昇順と降順
ちなみに、昇順と降順に関しては以下のように考える。
昇順 | 降順 | |
---|---|---|
英語 | ascending order(ASC) | descending order(DESC) |
基本的な並べ方 | 小->大 | 大->小 |
例1 | 1,2,3,...,10 | 10,9,8,...,1 |
例2 | a,b,c...,z | z,y,x,...,a |
例3 | aA1 | 1Aa |
このあたりの基本的なことも、未だに混乱することが多いので落書きをして覚えてみる。
以下は、具体的な並び替えの方法。基本的に昇順の並び替えは、既にmethodsがあるのでシンプルな処理で済むことが多い模様。
1. 配列を昇順に並び替え
これはシンプル。
Arrays.sort(intary);
System.out.println(Arrays.toString(intary));
出力結果:
[11, 17, 19, 23, 30, 41, 60, 61, 61, 92]
2. 配列を降順に並び替え
Collections.reverseOrder()
を使って降順に並び替える。そのためには、配列の型をwrapper class(この場合はInteger
)に変換したものを別途用意する必要がある。
Integer[] intary_desc = new Integer[intary.length];
Arrays.setAll(intary_desc, i -> intary[i]);
Arrays.sort(intary_desc, Collections.reverseOrder());
System.out.println(Arrays.toString(intary_desc));
出力結果
[98, 78, 61, 60, 57, 48, 43, 40, 37, 23]
3. リストを昇順に並び替え
リスト、ArrayList
では特に何もせずCollections
に付随するメソッドが使える[^1]。その中にあるsort()
を使って並び替える。
Collections.sort(intlist);
System.out.println(intlist);
出力結果は
[3, 18, 20, 21, 37, 45, 55, 70, 72, 74]
4. リストを降順に並び替え
上記の3. リストを昇順に並び替えと同様に、Collections
のメソッドsort()
を使うが、第2パラメータとして、コンパレーターを使う。
public static <T> void sort(List<T> list,Comparator<? super T> c)
Collections.sort(intlist, Collections.reverseOrder());
System.out.println(intlist);
出力結果
[89, 88, 81, 68, 63, 60, 52, 49, 46, 31]
テストコード
public static void main(String[] args) {
// Create array & list with int
int[] intary = new int[10];
ArrayList<Integer> intlist = new ArrayList<>();
for(int i = 0; i<10; i++){
intary[i] = (int)(Math.random()*100);
intlist.add((int)(Math.random()*100));
}
System.out.println("Original Array");
System.out.println(Arrays.toString(intary));
// 1-1 & 2-1 Duplicate / Create arrays for test
int[] intary_asc = intary;
Integer[] intary_desc = new Integer[intary.length];
Arrays.setAll(intary_desc, i -> intary[i]);
// 1. Array in ascending order
Arrays.sort(intary_asc);
System.out.println("1. Array in ascending order");
System.out.println(Arrays.toString(intary_asc));
// 2. Array in descending order
Arrays.sort(intary_desc, Collections.reverseOrder());
System.out.println("2. Array in descending order");
System.out.println(Arrays.toString(intary_desc));
System.out.println("\nOriginal List");
System.out.println(intlist);
// 3-1 & 4-1 Duplicate lists for test
ArrayList<Integer> intlist_asc = intlist;
ArrayList<Integer> intlist_desc = intlist;
// 3-2. List in ascending order
Collections.sort(intlist_asc);
System.out.println("3. List in ascending order");
System.out.println(intlist_asc);
// 4-2. List in descending order
Collections.sort(intlist_desc, Collections.reverseOrder());
System.out.println("4. List in ascending order");
System.out.println(intlist_desc);
}
出力結果
Original Array
[58, 22, 33, 51, 9, 25, 28, 36, 91, 3]
1. Array in ascending order
[3, 9, 22, 25, 28, 33, 36, 51, 58, 91]
2. Array in descending order
[91, 58, 51, 36, 33, 28, 25, 22, 9, 3]
Original List
[2, 51, 65, 33, 12, 23, 26, 16, 66, 78]
3. List in ascending order
[2, 12, 16, 23, 26, 33, 51, 65, 66, 78]
4. List in ascending order
[78, 66, 65, 51, 33, 26, 23, 16, 12, 2]
Discussion