성장일기

 코딩테스트 문제를 풀다보면 정렬을 해야하는 경우가 종종 있는데, Arrays.sort()함수는 배열을 기준으로 동작하는 함수인데 컬렉션을 적용하는 실수를 하곤 한다. 

 

 컬렉션을 정렬하기 위해서는 Collections.sort()함수를 써야하며 제네릭 타입으로 래퍼클래스를 받는 경우가 아니라면, 혹은 직접 정렬 기준을 정하고 싶을때는 정렬 기준을 구현해 주어야 한다.(ComparableComparator 인터페이스를 이용하는 방법이 있다.)

 

 이번 포스트에서는 배열의 정렬컬렉션 정렬에 대해 정리하려고 한다.

 

1. Arrays.sort() (오름차순)


Arrays.sort(str);

// 새로운 배열을 반환하는 것이 아닌 기존의 참조변수 배열을 정렬

정렬이 되는 기준은 오름차순으로 숫자 > 대문자 > 소문자 > 한글순

 

2. Arrays.sort() (내림차순)


Arrays.sort(str, Collections.reverseOrder());

// 새로운 배열을 반환하는 것이 아닌 기존의 참조변수 배열을 정렬

오름차순과 반대로 한글순 > 소문자 > 대문자 > 숫자  정렬

 

 


 

3. Collections.sort() (오름차순)


Collections.sort();

// 래퍼클래스를 제네릭타입으로 같고 있는 컬렉션을 오름차순으로 정렬

한글순 > 소문자 > 대문자 > 숫자 

 

 

4. Collections.reverse() (내림차순)


Collections.reverse();

// 래퍼클래스를 제네릭타입으로 같고 있는 컬렉션을 내림차순으로 정렬

 숫자 > 대문자 > 소문자 > 한글순

 

 

 

 

5. Comparable 인터페이스 와 Comparator 인터페이스


 아래와 같이 사용자가 정의한 Person클래스가 있다고 하고 이를 원소로 하는 List를 정렬하는 방법을 직접 구현하여 정렬해보도록 하겠다.

 

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

 

 

 

5.1 Comparable 인터페이스 구현


해당 클래스(Person) 내에 정렬기준을 compareTo 메소드를 오버라이드 하여 직접 구현한다.

public class Person implements Comparable<Person>{

    String name;
    int age;
    
    @Override
    public int compareTo(Person P){
    	
        if(this.age > p.age)
        	return 1;
        else if(this.age < p.age)
        	return -1;
        else
        	return 0;
    }
}

 

 

 

 

5.2 Comparator 인터페이스 구현


 Comparable인터페이스는 기준 클래스내에 Comparable인터페이스를 implements해야하고 compareTo()메소드를 오버라이드 해줘야 한다. 하지만 코딩테스트에서 클래스를 직접 만들어서 해당 클래스 compareTo()메소드를 직접 오버라이드 해야 할 일이 있을지는 모르겠다.

 

 그래서 Collections.sort()메소드의 두번째 인자로 Comparator 구현체를 받고 있다. 코딩테스트 문제를 풀다가 보통 Comparator 구현체를 익명클래스로 구현하여 구현체를 끼워넣는식은 많이 보았다. 따라서 익명 클래스로 구현한 코드는 아래와 같다.

 

Collections.sort(list, new Comparator<Student>(){
	
   @Override
   public int compare(Student s1, Student s2){
       if(s1.getAge() > s2.getAge())
           return 1;
       else if(s1.getAge() < s2.getAge())
           return -1;
       else
           return 0;
    }
}

공유하기

facebook twitter kakaoTalk kakaostory naver band