업데이트:

정렬하는 메소드를 매번 일일히 만들어서 사용할 수도 있지만, 이는 매우 번거롭다.
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보다 앞에 오는 것을 생각하면 된다.

댓글남기기