본문 바로가기
JAVA

[JAVA(자바)] Arrays.sort()와 Collections.sort() 차이 (feat. 오름차순, 내림차순) 및 Comparable

by 초이사 2022. 12. 27.

Arrays.sort()와 Collections.sort()에 대해 정리하고자 한다. 백준 2750번과 2751번을 풀면서 둘을 각각 사용했었는데,

둘의 차이가 무엇인지 어떨때, 사용하면 좋은지 정리해두면 좋을 것 같아 작성한다.

 

Arrays.sort()

  • 오름차순으로 정렬한다.
  • 배열의 값들을 정렬한다.
  • java.util 패키지에 포함된 클래스이다.
  • 정렬은 한글-소문자-대문자-숫자 순이다.
  • Dual-Pivot Quick Sort를 활용해서 평균적으로 O(nlogn)이나 최악의 경우(배열이 이미 정렬)에는 O(n²)이다.

 

내림차순으로 사용하는 방법은 2가지가 있다.

1. 오름차순으로 정렬한 배열을 뒤에서부터 앞으로 다시 저장한다.

2. Collections.reverseOrder()을 사용한다.

Collections는 객체에서만 사용가능하기 때문에 int[]는 객체가 아닌 Primary type으로 Integer[]로 해주어야 한다.

int[] arr = {4, 2, 3, 5, 1};	
Arrays.sort(arr); // 1,2,3,4,5

//Collections.reverseOrder()를 사용하기 위해 Integer타입 배열 선언
Integer[] arr2 = {4, 2, 3, 5, 1};
Arrays.sort(arr2, Collections.reverseOrder()); //5,4,3,2,1

 

 

 

Collections.sorts()

  • 오름차순으로 정렬한다.
  • 리스트의 값들을 정렬할 때 사용한다.
  • java.util 패키지에 포함된 클래스이다.
  • 정렬은 한글-소문자-대문자-숫자 순이다.
  • Merge Sort 나 Tim Sort(Insertion Sort + Merge Sort)를 활용해서 O(nlogn)이다. 

 

내림차순으로 사용하는 방법은 2가지가 있다.

1. 오름차순으로 정렬한 리스트를 뒤에서부터 앞으로 다시 저장한다.

2. Collection.reverse()을 사용한다.

 

int arr[] = {4, 2, 3, 5, 1};
//배열 리스트에 저장
ArrayList<Integer> list = Arrays.asList(str);
		
Collections.sort(list); // 1,2,3,4,5
Collections.reverse(list); // 5,4,3,2,1

 

 

Arrays.sort()는 보통 O(nlogn)의 효율을 보이지만 저격 데이터가 있다면 O(n²)이 되기 때문에 Collections.sort()가 더 좋은 선택이 될수도 있다. 하지만 Collections.sort()는 List 객체를 이용하기 때문에 메모리제한에 따라 초과가 날 수도 있다.

그때 그때 상황에 맞게 사용해야 할 것 같다.

 

 

 

Comparable 구현

자바에서 기본적으로 제공하는 Object인 String, Integer, Date등의 경우는 따로 구현할 필요 없이 Collection.sort()를 사용해서 정렬이 가능한다. 하지만 사용자가 정의한 객체의 경우에는 정렬 기준에 대해 따로 지정해주고 사용해야 한다.

 

아래와 같이 작성할 경우 Person의 정렬 기준이 정해지지 않았기 때문에 에러가 발생한다.

import java.util.*;

class Person{
	String name;
    int age;
    
    public person(String name, int age){
    	this.name = name;
        this.age = age;
    }
}

public class people {
	public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("Kim", 20));
        list.add(new Person("Gil", 30));
        list.add(new Person("Park", 27));

        collections.sort(list);
	}
}

 

정렬하기 위해 Person 객체의 정렬 기준을 정해주기 위해 Comparable 인터페이스를 구현해야 한다. implements Comparable<Person>을 해주고 비교를 위한 CompareTo() 메서드를 작성한다.

 

import java.util.*;

class Person implements Comparable<Person>{
	String name;
    int age;
    
    public Person(String name, int age){
    	this.name = name;
        this.age = age;
    }
    
    //return 값이 양수리면 위치 변경
    @Override
    public int compareTo(Person p){
    	if(age > p.age) return 1;
        else if (age < p.age) return -1;
        else return 0;
    }
}

public class Solution {
	public static void main(String[] args) {
		ArrayList<Person> list = new ArrayList<>();
	    list.add(new Person("Kim", 20));
	    list.add(new Person("Gil", 30));
	    list.add(new Person("Park", 27));
	    
	    Collections.sort(list);
	    
	    for(Person p : list) { //list 처음부터 끝까지 
	    	System.out.println(p.name+" "+p.age); //나이순으로 이름과 나이 출력
	    }
	 
	}
}

댓글