📊

並び替え(配列ORリスト)x(降順OR昇順)

2022/03/02に公開

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]

https://stackoverflow.com/questions/31901543/array-sorting-descending-order

3. リストを昇順に並び替え

リスト、ArrayListでは特に何もせずCollectionsに付随するメソッドが使える[^1]。その中にあるsort()を使って並び替える。

Collections.sort(intlist); 
System.out.println(intlist);

出力結果は

[3, 18, 20, 21, 37, 45, 55, 70, 72, 74]

https://www.geeksforgeeks.org/how-to-sort-an-arraylist-in-ascending-order-in-java/

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]

https://www.geeksforgeeks.org/how-to-sort-an-arraylist-in-descending-order-in-java/

https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List, java.util.Comparator)

テストコード


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