[JAVA] Array와 List 정렬하기(내림차순, 오름차순)

·2021년 7월 4일
0

JAVA

목록 보기
2/2

소팅할 때 쓰는 자바의 내장 함수들을 살펴보려고 한다.

알고리즘 문제를 풀다보면, 소팅하는 조건(오름차순, 내림차순, 커스텀, ...)이나 자료형(array, ArrayList, ...)에 따라 소팅하는 방법이 조금씩 달라서 쓸 때마다 헷갈린다..

코딩테스트에서 은근히 시간을 많이 잡아먹어서 이번 포스팅에서 확실히 알아두려 한다!

Array(배열) + 오름차순

int[] int_arr = {1,3,5,2,4}; 
double[] doublet_arr = {1.1, 3.3, 5.5, 2.2, 4.4}; 
String[] stringArr = {"A","C","F","E","D"}; 

Arrays.sort(intArr); 
Arrays.sort(doubletArr); 
Arrays.sort(stringArr);

Array(배열) + 내림차순

Integer[] integer_arr = {1,3,5,2,4}; // 오름차순 아닐땐 int[]로 안됨
String[] string_arr = {"A","C","B","E","D"}; 

Arrays.sort(integerArr, Collections.reverseOrder()); //내림차순 
Arrays.sort(stringArr, Collections.reverseOrder());

ArrayList + 오름차순/내림차순

ArrayList<Integer> arr = new ArrayList<>();

Collections.sort(arr);					// 오름차순
Collections.sort(list, Collections.reverseOrder());	// 내림차순

다중 array + 오름차순/내림차순

int[][] arr = {{3, 4, 5}, {1, 2, 3}, {5, 6, 7}};

// 방법 1
Arrays.sort(arr, (a, b) -> Integer.compare(a[1], b[1])); 	// [1]을 기준으로 오름차순
Arrays.sort(arr, (a, b) -> Integer.compare(b[1], a[1]));	// [1]을 기준으로 내림차순

// 방법 2
Arrays.sort(arr, (o1, o2) -> o1[2] - o2[2]); 		// [2]을 기준으로 오름차순
Arrays.sort(arr, (o1, o2) -> o2[2] - o1[2]);		// [2]을 기준으로 내림차순

// 방법 3 : Comparator override
Arrays.sort(arr, new Comparator<int[]>() {		// [0]을 기준으로 오름차순
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0] - o2[0];
    }
});

String array + 내림차순(?)


Integer[] arr = Arrays.stream(numbers).boxed().toArray(Integer[] :: new); // int[] -> Integer[]
Arrays.sort(arr);

String[] nums = new String[arr.length];
for(int i=0; i<arr.length; i++){
    nums[i] = arr[i].toString();
}
    
Arrays.sort(nums, new Comparator<String>() {
	@Override
	public int compare(String o1, String o2) {
		return (o2+o1).compareTo(o1+o2);
		// 내림차순 : return (o2+o1).compareTo(o1+o2);
		// 오름차순 : return (o1+o2).compareTo(o1+o2);
	}
});

이거는 특정 문제에 한정되었던 소팅 방법이긴 한데, 예를 들어 330이 있으면 이 두 정수를 붙혀서 가장 큰 수를 만들어야 했다. 숫자로 소팅하게 되면 30, 3이 되어서 303이 되어버리는데, 문제의 조건으로는 330이 나와야 했기 때문에 '문자열로 바꿔서' 303330을 비교하는 방식으로 소팅했다!


그리고 소팅이랑은 별 관계 없지만 맨날 헷갈리는거,

Length

  1. length : 배열의 길이를 알고자 할때 사용된다.
  2. length() : 문자열의 길이를 알고자 할때 사용된다.
  3. size() : Collection~ 타입의 길이를 알고자 할때 사용된다. (ArrayList, List, ...)

출처

코딩테스트 보면서 삽질한 내 코드들

profile
당근먹고 자라나는 개발자

0개의 댓글