본문 바로가기
코딩일기/Java

[Java] 2차원 배열 정렬 방법

by 욱파이어니어 2021. 6. 14.
728x90
반응형

2차원 배열을 사용하다보면 특정 index를 기준으로 정렬하고 싶을때가 있다.

 

물론 우리가 자료구조를 통해서 정렬을 할수도 있지만 정렬을 하는게 주된 문제가 아닐때는

자바에서 주어지는 정렬 클래스를 사용하는게 더 빠른 방법이다.

 

그래서 지난번에 배운 Comperable 혹은 Comperator 클래스를 사용하면 된다.

https://wpioneer.tistory.com/101

 

[Java] Comperator 와 Comperable

자바에서는 배열이나 리스트의 정렬을 위해서 Comperator와 Comparable 인터페이스를 제공한다. 두 인터페이스는 모두 정렬을 하기 위해서 사용한다는것은 동일하다. 하지만 둘의 차이점은 아래와 같

wpioneer.tistory.com

 

2차원 배열 오름차순

 

1차원 배열을 오름차순으로 정렬을 하고 싶을때는 아래와 같이 하면 됐었다.

Arrays.sort(배열)

 

하지만 2차원 배열을 오름차순으로 정렬 하고 싶을때는 

아래와 같이 해줘야 한다.

 

		int[][] costs = {{0,1,1},{0,2,2},{1,2,5},{1,3,1},{2,3,8}};
    	Arrays.sort(costs, new Comparator<int[]>() {

			@Override
			public int compare(int[] o1, int[] o2) {
				// TODO Auto-generated method stub
				return o1[2]-o2[2];
			}
			
		});

위소스는 costs라는 배열의 costs[2] index를 오름차순으로 정렬한다는 얘기이다.

 

위 소스를 람다식으로 표현 하면 아래와 같다.

 

Arrays.sort(costs,(o1,o2)->(o1[2]-o2[2]));

 

 

 

2차원 배열 내림차순

 

1차원 배열을 내림차순으로 정렬하고 싶을땐 int[] 배열을 Integer[] 배열로 변형 바꿔준뒤

Integer[]을 내림차순으로 정렬을 했었다.

 

		int[] temp = {0,2,4,5,1,7,9,8};
		Integer[] temp2 = Arrays.stream(temp).boxed().toArray(Integer[] :: new);
		Arrays.sort(temp2,Collections.reverseOrder());

 

하지만 2차원 배열에서는 위의 오름차순 정렬 소스에서 o1와 o2의 위치만 바꿔주면 된다.

int[][] costs = {{0,1,1},{0,2,2},{1,2,5},{1,3,1},{2,3,8}};
Arrays.sort(costs, new Comparator<int[]>() {

			@Override
			public int compare(int[] o1, int[] o2) {
				// TODO Auto-generated method stub
				return o2[2]-o1[2];
			}
			
});

 

위소스도 람다식으로 표현하면 아래와 같다.

 

Arrays.sort(costs,(o1,o2)->(o2[2]-o1[2]));

 

 

그리고 우리가 2차원 배열을 정렬하고자 할때 특정 index의 값이 같다면 그 안에 있는 값으로 정렬해야할때가 있다.

예를 들어 [3,4] [3,2]를 index 0을 기준으로 정렬하고 해야할때 두 배열 모두 3으로 같기 때문에 index 1의 자리를

기준으로 정렬을 해야한다.

 

해당 방법은 아래와 같다.

 

오름차순

		int[][] temp = {{3,2},{3,1},{4,1}};
		Arrays.sort(temp,(o1,o2)->{
				if(o1[0] == o2[0]) {
					return Integer.compare(o1[1], o2[1]);
				}else {
					return Integer.compare(o1[0], o2[0]);
				}
		});

결과 

[[3, 1], [3, 2], [4, 1]]

 

내림차순

 

		int[][] temp = {{3,2},{3,1},{4,1}};
		Arrays.sort(temp,(o1,o2)->{
				if(o2[0] == o1[0]) {
					return Integer.compare(o2[1], o1[1]);
				}else {
					return Integer.compare(o2[0], o1[0]);
				}
		});

결과

[[4, 1], [3, 2], [3, 1]]

 

반응형