[Java] 정렬 : Arrays.sort
업데이트:
정렬하는 메소드를 매번 일일히 만들어서 사용할 수도 있지만, 이는 매우 번거롭다.
Java에서는 배열이나 ArrayList에서 사용 가능한 Arrays.sort라는 정렬 메소드를 제공한다.
다른 자료구조에도 활용 가능한 Collections.sort 정렬 메소드도 제공하지만, 이 글에선 다루지 않았다.
기본적인 예시 코드
Arrays.sort를 사용하기 위해서는 java.util.Arrays를 import 해야 한다.
백준 10989번 - 수 정렬하기 3 (Silver 5)의 정답 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int number[] = new int[N];
for (int i = 0; i < N; i++)
number[i] = Integer.parseInt(br.readLine());
Arrays.sort(number);
for (int i = 0; i < N; i++)
bw.write(number[i] + "\n");
bw.close();
}
}
기본적으로는 Arrays.sort를 사용하면 오름차순으로 정렬된다.
람다식을 활용한 예시 코드
백준 10814번 - 나이순 정렬 (Silver 5)의 정답 코드이다.
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
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
Person people[] = new Person[N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int age = Integer.parseInt(st.nextToken());
String name = st.nextToken();
people[i] = new Person(age, name);
}
Arrays.sort(people, (p1, p2) -> p1.age - p2.age);
for (int i = 0; i < N; i++) {
bw.write(people[i].age + " " + people[i].name + "\n");
}
bw.close();
}
}
class Person {
Integer age;
String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
기본적인 int, string 등의 정렬이 아닌 사용자가 원하는 조건으로 정렬하고 싶을 때 사용 가능하다.
이 예시에서는 Person 객체들의 정렬을 수행했다.
19행을 참고하면 되는데, 복잡한 정렬 조건이 들어간다면 람다식으로 쓰기가 조금 번거로울 것이다.
compareTo 메소드의 오버라이딩을 활용한 예시 코드
백준 11651번 - 좌표 정렬하기 2 (Silver 5)의 정답 코드이다.
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.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
Point points[] = new Point[N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
points[i] = new Point(x, y);
}
Arrays.sort(points);
for (int i = 0; i < N; i++) {
bw.write(points[i].x + " " + points[i].y + "\n");
}
bw.close();
}
}
class Point implements Comparable<Point> {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Point p) {
if (this.y != p.y)
return this.y - p.y;
return this.x - p.x;
}
}
36행 이후를 보면 된다.
Comparable <Point> 인터페이스의 compareTo 메소드를 구현하는 과정이다.
이를 Point 클래스에 구현하면 compareTo 메소드를 기준으로 정렬되게 만들 수 있다.
a.compareTo(b)가 음수일 때 Arrays.sort를 수행하면 a가 b보다 앞에 오게 된다.
헷갈린다면 int의 오름차순 정렬에서 a - b가 음수이면 a가 b보다 앞에 오는 것을 생각하면 된다.
댓글남기기