(JAVA) sort를 사용하여 배열 정렬하기(오름차순, 내림차순)

Arrays.sort란?

자바에서 기본적으로 제공해주는 정렬 함수로, 배열이나 리스트를 정렬할 때 사용해. 따로 정렬 로직을 짜지 않아도 메소드 호출 한 번으로 오름차순 정렬을 할 수 있어 유용해.

sort()를 사용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.Arrays;

public class Sort {

	public static void main(String[] args) {
		int[] numList = {1,39, 2, 17, 6, 291};
		Arrays.sort(numList);
		
		for(int i:numList) {
			System.out.println(i);
		}
	}
}

숫자 배열 뿐만 아니라 영문, 한글, 객체 역시 오름차순 정렬이 가능해.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Arrays;

public class Sort {

	public static void main(String[] args) {
		String[] words = {"피카츄","라이츄","파이리","꼬부기","버터플","야도란"};
		Arrays.sort(words);
		
		for(String i:words) {
			System.out.println(i);
		}

	}

}

내림차순은 어떻게 해야할까?

내림차순은 Collection.reverseOrder()를 사용해야 해.
위의 오름차순 예제들을 내림차순으로 변경해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Arrays;
import java.util.Collections;

public class Sort {

	public static void main(String[] args) {
		String[] words = {"피카츄","라이츄","파이리","꼬부기","버터플","야도란"};
		Arrays.sort(words, Collections.reverseOrder());
		
		for(String i:words) {
			System.out.println(i);
		}

	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.Arrays;
import java.util.Collections;

public class Sort {

	public static void main(String[] args) {
		Integer[] numList = {1,39, 2, 17, 6, 291};
		Arrays.sort(numList, Collections.reverseOrder());
		
		for(int i:numList) {
			System.out.println(i);
		}
	}
}

주의할 점 : 기본형 타입들을 내림차순으로 정렬하고 싶다면 배열을 래퍼클래스로 만들어주어야 정렬이 가능해. 예를 들어 int를 내림차순 정렬할 경우, Integer로 변경해주어야 해.
String은 기본 타입이 아니므로 타입 변환 없이 정렬이 가능해.

객체 배열을 정렬해보자

객체는 어떻게 배열해야 할까? 단순한 숫자나 알파벳 순 정렬이 아니니까, 객체 별 정렬 기준이 필요할 것 같아. 이 때 사용하는 게 ComparableComparator야. 두 인터페이스 모두 정렬에 사용되는 인터페이스인데, 내가 정한 로직대로 배열을 정렬해주는 기능을 해.

위에서 배운 sort() 역시 Comparable을 미리 구현해 둔 함수인거지.

1.Comparable
사용법은 주어진 객체보다 작으면 음수, 같으면 0, 크면 양수를 반환하는 식으로 구현하면 돼.
예를 들어서, 나이를 기준으로 객체를 정렬하는 프로그램을 만들어 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.Arrays;

public class Person implements Comparable<Person>{
	
	private String name;
	private int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public int compareTo(Person person) {
		if(this.age<person.age) {
			return -1;
		}else if(this.age==person.age) {
			return 0;
		}else {
			return 1;
		}
	}
		
	public static void main(String[] args) {
		
		Person[] list = {
				new Person("재희", 29),
				new Person("희강", 19),
				new Person("민정", 28),
				new Person("성은", 31),
				new Person("승하", 52)				
		};
		
		Arrays.sort(list);
		
		for(Person i:list) {
			System.out.println(i.name+"의 나이는 "+i.age);
		}

	}
}

결과를 확인해보면, 나이를 기준으로 객체들이 오름차순 정렬되어 있을 거야.
내림차순을 할 경우 로직을 반대로 구현(주어진 객체보다 작으면 양수, 같으면 0, 크면 음수를 반환)하면 돼.

2.Comparator
Comparator는 Comparable보다 조금 더 복잡한 정렬이 가능하고, 필요할 때 마다 익명 객체로 구현해서 사용할 수도 있는 인터페이스야. int compate(T t1, T t2)를 구현한 후 → compareTo와 마찬가지로 t1과 t2를 비교해서 → t1이 더 작으면 음수, 둘이 같으면 0, t1이 더 크면 양수를 반환하면 돼.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.Arrays;
import java.util.Comparator;

public class Person implements Comparable<Person>{
	
	private String name;
	private int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public int compareTo(Person person) {
		if(this.age<person.age) {
			return -1;
		}else if(this.age==person.age) {
			return 0;
		}else {
			return 1;
		}
	}	
	
	public static void main(String[] args) {
		
		Person[] list = {
				new Person("재희", 29),
				new Person("희강", 19),
				new Person("민정", 28),
				new Person("성은", 31),
				new Person("승하", 52)				
		};
		
		
		Comparator<Person> cp = new Comparator<Person>() { // 익명객체로 구현

			@Override
			public int compare(Person person1, Person person2) {		
				return person1.age - person2.age; //역순으로 정렬할 경우 이 비교 순서를 바꿔주면 됨
			}
		};
		
		Arrays.sort(list, cp);
		
		for(Person i:list) {
			System.out.println(i.name+"의 나이는 "+i.age);
		}

	}
}