Comparator & Comparable ๐งโโ๏ธ
Comparable
โ์๊ธฐ ์์ ๊ณผ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋น๊ต + compareTo ๋ฐ๋์ ๊ตฌํโ์ ์ vs ์ ์
Comparator
โ๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋น๊ตโ์ ์ vs ์ ์ ์ฌ์ด์ ์ฌํ
๊ณตํต์ ์ผ๋ก๋ ๋น๊ตํ๋ ๋ฉ์๋์ด์ง๋ง ์ค์ง์ ์ผ๋ก๋ ๋น๊ต๋์์ด ๋ค๋ฆ.
Comparable ์ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด compareTo ๋ฉ์๋๋ฅผ ์ฌ์ ์(Override/๊ตฌํ)์ ํด์ผํจ.
Comparator ์์ ๊ตฌํํด์ผํ๋ ๊ฒ์ compare(T o1,T o2) ๋ฉ์๋์ด๋ค.
Comparable
์๋ฐ์ ๊ธฐ๋ณธ์ผ๋ก ์ ์ฉ๋ Comparable์ ๋ฏ์ด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
1
2
3
4
5
6
7
8
9
public final class Integer extends Number implements Comparable<Integer> {
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
//๊ฐ์ผ๋ฉด 0 ์์ผ๋ฉด 1 ํฌ๋ฉด -1
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
}
์ฃผ์์๋ ์ค๋ช
์ด ์๋ฏ์ด ๊ฐ์ผ๋ฉด 0 ์์ผ๋ฉด 1 ํฌ๋ฉด -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
26
27
28
29
30
31
32
33
34
Student class์ age์ classNumber๊ฐ ์๋ค๊ณ ๊ฐ์ .
class Student implements Comparable<Student> {
int age; // ๋์ด
int classNumber; // ๋ฐ ๋ฒํธ
Student(int age, int classNumber) {
this.age = age;
this.classNumber = classNumber;
}
//์ ์
@Override
public int compareTo(Student o) {
// ์๊ธฐ์์ ์ age๊ฐ o์ age๋ณด๋ค ํฌ๋ค๋ฉด ์์
if(this.age > o.age) {
return 1;
}
// ์๊ธฐ ์์ ์ age์ o์ age๊ฐ ๊ฐ๋ค๋ฉด 0
else if(this.age == o.age) {
return 0;
}
// ์๊ธฐ ์์ ์ age๊ฐ o์ age๋ณด๋ค ์๋ค๋ฉด ์์
else {
return -1;
}
}
//์ผ๋งค?
@Override
public int compareTo(Student o) {
return this.age - o.age;
}
}
์ ์์ ๋ฐฉ๋ฒ๊ณผ ์ผ๋งค์ค๋ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก compareTo๋ฅผ ๊ตฌํํ๋ค. ์ซ์๋ฅผ ๋น๊ตํ ๋ ํฐ์๋ ๋นผ๋ฉด ์์๊ฐ๋๊ณ ์์์๋ ์์๊ฐ ๋๋ ์ ์ ์ด์ฉํด์ ์ง ์ฝ๋์ด๋ค. ๋ค๋ง ์ ์ผ๋งค์๋ ํจ์ ์ด์๋ค. int ์๋ฃํ์ฒ๋ผ ํํ๋ฒ์๊ฐ 21์ต47~๊น์ง ๋์ด์์ด ๊ทธ ์ด์, ๊ทธ ์ดํ์ ์ซ์๊ฐ ๋ค์ด์ค๊ฒ ๋๋ฉด ์ค๋ฒํ๋ก์ฐ๋ ์ธ๋ํ๋ก์ฐ๋ก ์ธํด ๊ฐ์ด ์๋ชป ๋ฐํ ๋ ์ ์๋ค. ๊ทธ๋ฆฌํ์ฌ ์ด๋ฐ ์ ์ ๋ฏธ์ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์ ์์ฒ๋ผ ์ฝ๋๋ฅผ ์ง๋ฉด ์ฌ์ ์ ๋ณด์ํ ์ ์๋ค.
Comparator
Comparable์ compareTo()์ ๋ค๋ฅด๊ฒ Comparator์ compare์ ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ค. ์ด๋ฒ์๋ ์๊น ์ฌ์ฉํ student ๊ฐ์ฒด์์ classNumber์ ๋น๊ตํ๊ณ ์ ํ๋ค.
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
Student class์ age์ classNumber๊ฐ ์๋ค๊ณ ๊ฐ์ .
class Student implements Comparator<Student> {
int age; // ๋์ด
int classNumber; // ๋ฐ ๋ฒํธ
Student(int age, int classNumber) {
this.age = age;
this.classNumber = classNumber;
}
@Override
public int compare(Student o1, Student o2) {
if(o1.classNumber > o2.classNumber) {
return 1;
}
else if(o1.classNumber == o2.classNumber) {
return 0;
}
else {
return -1;
}
}
//์ผ๋งค?
@Override
public int compare(Student o1, Student o2) {
return o1.classNumber - o2.classNumber;
}
}
๋งจ ์์์ ์ฌํ์ด๋ผ๋ ํํ์ฒ๋ผ o1๊ณผ o2์ ๋น๊ต๋ฅผ ํ ๋ฟ, Student๋ฅผ ํธ์ถํ ๊ฐ์ฒด์๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
comparable์์์ฒ๋ผ int ๋ฒ์๋ด๋ฅผ ๋์ง์๋๋ค๋ฉด ์ผ๋งค๋ฐฉ๋ฒ์ ์จ๋ ๋ฌด๋ฐฉํ๋ค.
์ฌ์ค ๋ณ์ฐจ์ด์์ด๋ณด์ด๋๋ฐ Comparator์ ์ฅ์ ์ ๋ฌด์์ผ๊น? ๋ฐ๋ก ์ต๋ช
ํด๋์ค๋ฅผ ์ด์ฉํด ์ปค์คํ
๋ง์ด์งํ ๋น๊ต๋ฅผ ํ ์ ์๋ค
๋ ์ ์ด๋ค.
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
public static void main(String[] args) {
Student a = new Student(17, 2); // 17์ด 2๋ฐ
Student b = new Student(18, 1); // 18์ด 1๋ฐ
Student c = new Student(15, 3); // 15์ด 3๋ฐ
int i = classNumberCompare.compare(a,b);
if(i >0){...}
else if(i <0){...}
else {...}
int j = ageCompare.compare(a,b);
if(j >0){...}
else if(j <0){...}
else {...}
}
//ํ์์ ๋ฐ๋ณ, ๋์ด๋ณ๋ก ๋น๊ตํด์ผํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค. ์ด๋ด๋ ์ต๋ช
ํด๋์ค๋ฅผ ์ด์ฉํด ์ปค์คํ
๋ง์ด์งํ ๋น๊ต๋ฅผ ํ ์ ์๋ค.
public static Comparator<Student> classNumberCompare= new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.classNumber - o2.classNumber;
}
};
public static Comparator<Student> ageCompare = new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.age - o2.age;
}
};
๋ค์ํ ์ถ๋ ฅ์ ์๋ฅผ ๋ชจ์๋ดค๋ค.
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
import java.util.*;
public class comparatorTest {
public static void main(String[] args) {
String[] animals = {"cat", "Dog", "lion", "Tiger"};
List<String> animal_list = new ArrayList<String>(Arrays.asList(animals));
Arrays.sort(animals); //Comparable์ ์ ์
System.out.println("1 Arrays ์ ๋ ฌ= "+ Arrays.toString(animals));
Collections.sort(animal_list);
System.out.println("2 ์ปฌ๋์
์ ๋ ฌ = "+ animal_list);
Arrays.sort(animals, String.CASE_INSENSITIVE_ORDER); //๋์๋ฌธ์ ๊ตฌ๋ณ์ํ๊ณ sort
System.out.println("3 = "+ Arrays.toString(animals));
Arrays.sort(animals, new Desending());
System.out.println("4 = "+ Arrays.toString(animals));
Collections.sort(animal_list, (o1,o2)->{
if(o1 instanceof Comparable && o2 instanceof Comparable){
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable) o2;
return c1.compareTo(c2)*-1;}
else return -1;
});
System.out.println("5 = "+ animal_list);
}
private static class Desending implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return -(o1.compareTo(o2));
}
}
}
// 1 Arrays ์ ๋ ฌ= [Dog, Tiger, cat, lion]
// 2 ์ปฌ๋์
์ ๋ ฌ = [Dog, Tiger, cat, lion]
// 3 = [cat, Dog, lion, Tiger]
// 4 = [lion, cat, Tiger, Dog]
// 5 = [lion, cat, Tiger, Dog]
์ถ์ฒ
- ์ค๋ผํด/์๋ฐ/8
- ์๋ฐ์ ์ ์