알고리즘

[자바정렬] Arrays.sort() Collections.sort()

경딩 2024. 8. 6. 17:50

 
 
1차원 배열 오름차순 정렬

// 1차원 배열 오름차순 Sort
int[] nums = { 2, 4, 9, 8};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
//결과 [2, 4, 8, 9]

 
1차원 배열 내림차순 정렬 (for문 활용)

// 1차원 배열 내림차순 Sort
   int[] nums = { 2, 4, 9, 8};
        Arrays.sort(nums);
        for(int i=0; i< nums.length/2; i++ ){
            int tmp = nums[i];
            nums[i] = nums[nums.length - 1 -i];
            nums[nums.length - 1 -i] = tmp;
        }
 System.out.println(Arrays.toString(nums));//[9, 8, 4, 2]

 
 
 
1차원 배열 Stream 정렬

// 1차원 배열 내림차순 Sort
   int[] nums = { 2, 4, 9, 8};
   int[] descNums = Arrays.stream(nums)
                   .boxed().sorted(Collections.reverseOrder())
                   .mapToInt(Integer::intValue).toArray();

   System.out.println(Arrays.toString(descNums));

 
2차원 배열 정렬 : 정렬 기준(비교기준) 추가 필요
2차원 배열을 바로 Arrray.sort()를 통해 정렬하려고 하면 java.lang.ClassCastException: I cannot be cast to java.lang.Comparable 오류가 발생합니다. 원인은 비교 기준이 구현되어 있지 않기 때문에 캐스팅에 실패했기 때문이라 아래와 같이 Comparable,Comparator 인터페이스를 구현하여 정렬기준을 추가해 줘야 합니다. 2차원배열 뿐만 아니라 객체비교할 때도 동일한 유사하니 참고해주세요.
 

int[][] arr = new int[][]{{5,10},{3,30},{1,50},{4,20},{2,40},{5,60}};

Arrays.sort(arr);// ClassCastException: class [I cannot be cast to class java.lang.Comparable

 
 
> Comparator 익명 클래스 구현 방법

        int[][] arr2 = new int[][]{{5,40},{3,50},{1,30},{4,20},{2,10},{6,40},{6,50},{6,10},{6,20},{6,30}};

        Arrays.sort(arr2, new Comparator<int[]>() {
            public int compare(int[] o1, int[] o2){
                 return o1[0]!= o2[0] ? o1[0]-o2[0] : o1[1]-o2[1]; // 첫번째 기준 오름차순 > 두번째 기준 오름차순 : [[1, 30], [2, 10], [3, 50], [4, 20], [5, 40], [6, 10], [6, 20], [6, 30], [6, 40], [6, 50]]
            }
        });

        System.out.println(Arrays.deepToString(arr2));

 
> Lamdda 사용 : 자바 8 이상

Arrays.sort(arr2, (o1,o2) -> o1[0] - o2[0] ); // [[1, 30], [2, 10], [3, 50], [4, 20], [5, 40], [6, 40], [6, 50], [6, 10], [6, 20], [6, 30]]
Arrays.sort(arr2, (o1,o2) -> o1[0] != o2[0] ? o1[0]-o2[0] :o1[1]-o2[1] ); // [[1, 30], [2, 10], [3, 50], [4, 20], [5, 40], [6, 10], [6, 20], [6, 30], [6, 40], [6, 50]]

int[][] routes
int 이차원 배열
객체 정렬
 

compareTo()

- int compareTo(NumberSubClass referenceName)
- int compareTo(String anotherString)
- compareTo() 함수는 두개의 값을 비교하여 int 값으로 반환해주는 함수이다.
출처: https://mine-it-record.tistory.com/133 [나만의 기록들:티스토리]

 

더보기

사용예시)
 
         Arrays.sort(routes, (o1,o2) -> o1[0]-o2[0]);
        Arrays.sort(routes, new Comparator<int[]>(){</int[]>
           public int compare(int[] o1, int[] o2){
               return o1[0]-o2[0];
           }
        });
 
String[][] tickets
 
String 이차원 배열
 
   Arrays.sort(tickets, new Comparator<string[]>(){</string[]>
            @Override
            public int compare(String[] o1, String[] o2){
                return o1[1].compareTo(o2[1]);
            }
        });
 
--
int[] numbers)  int 배열을 String 배열로 변환 후 테스트
        String[] s = new String[numbers.length];
        for(int i= 0; i<numbers.length; i++){
            s[i] = Integer.toString(numbers[i]);
        }

 Arrays.sort(s,(o1,o2) -> (o1+o2).compareTo(o2+o1));
컬렉션 정렬 Collections.sort(m, (o1,o2) -> o2.plays-o1.plays);

 

 

int[][] grid = new int[n][2];
    Arrays.sort(grid, (a1, a2) -> {
       if(a1[0]== a2[0]) return a1[1] - a2[1];
       else return a1[0] - a2[0];
});