SORT
오름차순, 내림차순 정렬
ArrayList
를 이용해 정렬을 해보자
우선 단순히 숫자 배열을 만들어 오름차순과 내림차순으로 정렬하는 법을 살펴보겠다.
sort
를 이용해 오름차순 정렬을 하려면
list.sort(null);
또는 list.sort(Comparator.naturalOrder());
를 사용하면 된다.
내림차순 정렬은
list.sort(Comparator.reverseOrder());
이다.
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.ArrayList;
import java.util.Comparator;
public class Compare {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1); list.add(4);
list.add(6); list.add(2);
list.add(5);
list.sort(null);
System.out.println("오름차순 : " + list.toString());
list.sort(Comparator.naturalOrder());
System.out.println("오름차순 : " + list.toString());
list.sort(Comparator.reverseOrder());
System.out.println("내림차순 : " + list.toString());
}
}
실행결과
1
2
3
오름차순 : [1, 2, 4, 5, 6]
오름차순 : [1, 2, 4, 5, 6]
내림차순 : [6, 5, 4, 2, 1]
객체 정렬
그렇다면 임의로 만든 객체를 정렬할때는 어떻게 해야할까
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
class Number {
private int x;
private int y;
public Number(int x, int y) {
this.x = x;
this.y = y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
예를들어 Number란 클래스가 있고 x와 y라는 값을 가진다고하자.
2개의 수를 가진 객체 배열을 만들어서
x^2 + y^2
를 한 값을 기준으로 오름차순 정렬을 할 것이다.
만약 계산한 두 값이 같다면 x를 기준으로 오름차순 정렬을 한다.
이 경우의 코드는
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
arr.sort(new Comparator<Number>() {
@Override
public int compare(Number o1, Number o2) {
int x1 = o1.getWn();
int y1 = o1.getIn();
int x2 = o2.getWn();
int y2 = o2.getIn();
int num1 = x1 * x1 + y1 * y1;
int num2 = x2 * x2 + y2 * y2;
if (num1 > num2)
return 1;
else if (num1 < num2)
return -1;
else {
if (x1 > x2)
return 1;
else
return -1;
}
}
});
이렇게 sort 함수안에 compare함수를 통해 정렬기준을 정해주면 된다.
정렬기준은
- 기준이 되는 데이터보다 비교 데이터가 작다면 양수를 반환
- 기준이 되는 데이터와 비교 데이터가 같다면 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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
class Number {
private int wn;
private int in;
public Number(int wn, int in) {
this.wn = wn;
this.in = in;
}
public void setWn(int wn) {
this.wn = wn;
}
public void setIn(int in) {
this.in = in;
}
public int getWn() {
return wn;
}
public int getIn() {
return in;
}
public String toString() {
if (in < 0)
return wn + " " + in + "i";
else
return wn + " + " + in + "i";
}
}
public class ComplexNumber {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
int num;
List<Number> arr = new ArrayList<Number>();
System.out.print("복소수의 수를 입력하라: ");
num = scanner.nextInt();
int sum1 = 0, sum2 = 0;
for (int i = 1; i <= num; i++) {
int a, b;
System.out.print("복소수 " + i + "의 정보를 입력하라: ");
a = scanner.nextInt();
b = scanner.nextInt();
arr.add(new Number(a, b));
sum1 += a;
sum2 += b;
}
arr.sort(new Comparator<Number>() {
@Override
public int compare(Number o1, Number o2) {
int wn1 = o1.getWn();
int in1 = o1.getIn();
int wn2 = o2.getWn();
int in2 = o2.getIn();
int num1 = wn1 * wn1 + in1 * in1;
int num2 = wn2 * wn2 + in2 * in2;
if (num1 > num2)
return 1;
else if (num1 < num2)
return -1;
else {
if (wn1 > wn2)
return 1;
else
return -1;
}
}
});
PrintWriter pw = new PrintWriter("./ComplextNumbet.txt");
pw.println("정렬 결과:");
for (int i = 0; i < arr.size(); i++) {
pw.println(arr.get(i).toString());
}
pw.println("\n합:");
if (sum2 < 0)
pw.println(sum1 + " " + sum2 + "i");
else
pw.println(sum1 + " + " + sum2 + "i");
pw.close();
}
}