๐ Arrays.sort & Collections.sort
๋๋ค ์๋ฐ์์ ๋ฐฐ์ด์ ์ ๋ ฌ ํ ๋ ์ฌ์ฉ๋๋ค.
1. Arrays.sort
์ด ๋ฉ์๋๋ ๋ฐฐ์ด์ ํ์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
์ฆ, ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์ ๊ณผ ๊ฐ์ฒด ํ์ ์ ๋ํด ๋ค๋ฅด๊ฒ ๋์ํ๋ค.
1๏ธโฃ ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์ ์ ์ ๋ ฌ (int[], double[] ๋ฑ)
ํ๋ฆฌ๋ฏธํฐ๋ธ ํ์ ์ ๋ฐฐ์ด์ ์ ๋ ฌํ ๋ Dual-Pivot Quicksort ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
๋ ๊ฐ์ ํผ๋ฒ์ ์ฌ์ฉํด์ ๋ฐฐ์ด์ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ ์ ๋ ฌํ๋ค.
์๊ณ ๋ฆฌ์ฆ ์ ๋ณด๊น์ง๋ ์ด ๊ธ์ด ๋๋ฌด ๊ธธ์ด์ง ์ฐ๋ ค๊ฐ ์์ด์ ๋์ค์ ์ ๋ฆฌ ๊ธ์ ์ฌ๋ฆฌ๊ธฐ๋ก ํ๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ํ๊ท ์ ์ผ๋ก O(n log n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฉฐ, ์ต์ ์ ๊ฒฝ์ฐ O(n^2)๊น์ง ๊ฐ ์ ์์ง๋ง, ์ต์ ์ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ๋งค์ฐ ๋ฎ๋ค.
2๏ธโฃ ๊ฐ์ฒด ํ์ ์ ์ ๋ ฌ (Integer[], String[] ๋ฑ)
๊ฐ์ฒด ํ์ ์ ๋ฐฐ์ด์ ์ ๋ ฌํ ๋๋ TimSort ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ MergeSort์ InsertionSort๋ฅผ ๊ฒฐํฉํ ํ์ด๋ธ๋ฆฌ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ๊ฒฝ์ฐ์๋ O(n log n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฉฐ, ์์ ์ ์ธ ์ ๋ ฌ์ ๋ณด์ฅํ๋ค.
๐ก Arrays.sort(Object[]) ์ฌ์ฉ์ ์ฃผ์ํ ์
๐๐ป Arrays.sort(Object[]) ์ฌ์ฉ ์์๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๊ฐ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผํ๋ค.
sort ๋ฉ์๋๊ฐ ๋ฐฐ์ด์ ์์๋ค์ ์ ๋ ฌํ๊ธฐ ์ํด ๋น๊ต ์์ ์ ์ํํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ ฌ ๊ณผ์ ์์ ์์ ํ๋ํ๋ ์๋ก ๋น๊ต๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ์์๋ค์ ๋น๊ต๊ฐ ๊ฐ๋ฅํด์ผํ๋ค.
๋ด๋ถ ๋์ ์ ์์ ๋น๊ต๋ฅผ ์ํด Comparable ์ธํฐํ์ด์ค์ compareTo()๋ฅผ ํธ์ถํ๊ณ ์๋ค.
๋ฐ๋ผ์ ๋ฐ๋์ ๊ฐ์ฒด ํ์ ์ ๋น๊ตํ ๋๋ ๊ฐ ์์๊ฐ Comparable์ ๊ตฌํํ๊ณ ์๋์ง ์ฒดํฌํด์ผํ๋ค.
์ปดํ์ผ ๋จ๊ณ์์๋ ๋ฌธ๋ฒ์ ์ค๋ฅ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ ์์ ๋ฟ๋๋ฌ ์ด๊ฑด ์ ๋ง ์ํํ๋ค.
String๊ณผ Wrapper ํด๋์ค๋ค์ Comparable์ ๊ตฌํํ๊ณ ์์ผ๋ ๊ด์ฐฎ์ง๋ง, ๊ทธ ์ธ์ ๊ฐ์ฒด๋ค์ ์ฌ์ฉ ์ ์ฃผ์ํด์ผํ๋ค.
2. Collections.sort
์๋ฐ์์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ ๋ ์ฌ์ฉ๋๋ค.
๋ด๋ถ์ ์ผ๋ก List์ ์์๋ค์ ์ ๋ ฌํ๊ธฐ ์ํด Arrays.sort ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. → TimSort ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฐ
1๏ธโฃ ๊ธฐ๋ณธ ๋์ ์๋ฆฌ
- ๋ฆฌ์คํธ๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํ๋ค
- ๋ฐฐ์ด์ Arrays.sort๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฌํ๋ค
- ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ค์ ๋ฆฌ์คํธ๋ก ๋ณํํ๋ค.
์ด๋ ๊ฒ ๊ธฐ๋ณธ ๋์์์ ์ ์ ์๋ฏ์ด Arrays.sort์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋น๊ตํ ์์๋ค์ด Comparable์ ๊ตฌํํ ์ํ์ฌ์ผํ๋ค.
๐กCollections.sort ํน์ด์
๐๐ป Collections.sort๋ ์ปดํ์ผ ๋จ๊ณ์์ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์์ ๊ฐ์ฒด์ ์ค๋ฅ๋ฅผ ์ก์ ์ ์๋ค.
Arrays.sort๋ ์ปดํ์ผ ๋จ๊ณ์์ ์ก์๋ผ ์ ์์์ง๋ง, Collections.sort๋ ์ก์๋ผ ์ ์๋ค.
public static <T extends Comparable<? super T>> void sort(List<T> list)
์์ ์ฝ๋๋ Collections.sort์ ์๊ทธ๋์ฒ์ด๋ค. ์ด ๋ฉ์๋๋ ์ ๋ค๋ฆญ ๋ฉ์๋๋ก ์ ์๋์ด์๋ค.
<T extends Comparable<? super T>>
ํ์ ๋งค๊ฐ๋ณ์์ธ T๊ฐ ๋ฐ๋์ Comparable์ ๊ตฌํํด์ผ ํ๋ค๋ ๊ฒ์ ๋ํ๋ธ๋ค.
Comparable<? super T> : Tํ์ ์ด ๋ฐ๋์ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผํ๊ณ , ์ด ์ธํฐํ์ด์ค๋ T ํ์ ๋๋ T์ ์์ ํ์ ์ ๋น๊ตํ ์ ์์ด์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ ๋ค๋ฆญ์ค๋ ์ปดํ์ผ ์ ํ์ ์ฒดํฌ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์์ ์ค๋ฅ๋ฅผ ์ก์ ์ ์๊ฒ๋๋ ๊ฒ์ด๋ค.
โ ๊ฒฐ๋ก : ๊ฐ์ ์ํฉ์ด๋ผ๋ฉด Collections.sort๋ฅผ ์ ์ฉํ์.
๐ Comparable & Comparator
๋๋ค ์ธํฐํ์ด์ค์ด๋ฉฐ, ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ๋น๊ตํ ๋ ์ฌ์ฉ๋๋ค.
๋ ์ธํฐํ์ด์ค์ ์ฐจ์ด์
Comparable : ์๊ธฐ ์์ ๊ณผ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ค.
Comparator : ๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ค.
1. Comparable
public interface Comparable<T> {
public int compareTo(T o);
}
์ค์ Comparable ์ธํฐํ์ด์ค ์ฝ๋์ด๋ค. ๋ด๋ถ์ compareTo ๋ฉ์๋๋ง์ ํฌํจํ๊ณ ์๋ค.
๋ฐ๋ผ์, Comparable์ ๊ตฌํ์ฒด๋ ๋ฐ๋์ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํ๋ค.
๋งค๊ฐ๋ณ์๊ฐ ํ๋์ธ ๊ฒ์ผ๋ก ์ ์ถํ ์ ์๋ฏ์ด ์๊ธฐ ์์ ๊ณผ ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ ์ธํฐํ์ด์ค๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
๋ํ ๋งค๊ฐ๋ณ์๊ฐ ๊ฐ์ฒด์ธ ๊ฒ์ ์ฃผ์ํ๋๋ก ํ๋ค.
compareTo() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ์ ์๋๋ก ๋ง๋ค ์ ์๋ค.
Integer, Double, String ๋ชจ๋ ์ด Comparable์ ๊ตฌํํ๊ณ ์์ด์ ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฌ๋ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด(๋ด๊ฐ ๋ง๋ ๊ฐ์ฒด)๋ Comparable์ ๋ฐ๋ก ๊ตฌํํด์ค์ผ ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค.
public final class Integer extends Number
implements Comparable<Integer>, Constable, ConstantDesc {
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
}
Integer์ ์ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์๊ธฐ ์์ ๊ณผ ๊ฐ์ฒด๋ก ๋์ด์จ ๋ค๋ฅธ Integer๋ฅผ ๋น๊ตํ๋ ๊ฒ์ ์ ์ ์๋ค.
compareTo() ์ฌ์ฉ๋ฒ
์๊ธฐ ์์ ๊ณผ ๋งค๊ฐ ๋ณ์ ๊ฐ์ฒด์ ์ฐจ์ด๋ฅผ ๋น๊ตํ๋ฉฐ ํฌ๋ฉด ์์, ๊ฐ์ผ๋ฉด 0, ์์ผ๋ฉด ์์๋ฅผ ๋ฐํํ๋ค.
๋น๊ต ๊ฒฐ๊ณผ | ๋ฐํ ๊ฐ |
์๊ธฐ ์์ > ๋งค๊ฐ ๋ณ์ (์ฐ์ ์์๊ฐ ๋์ ๊ฒฝ์ฐ) | ์์ |
์๊ธฐ ์์ = ๋งค๊ฐ ๋ณ์ | 0 |
์๊ธฐ ์์ < ๋งค๊ฐ ๋ณ์ (์ฐ์ ์์๊ฐ ๋ฎ์ ๊ฒฝ์ฐ) | ์์ |
๋ฉ์๋์ ๋ฐํ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๋ ์ ๋ ฌ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฆ์ฐจ์์ด๋ค. ๋น๊ต ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๊ฐ์ฒด์ ์์๊ฐ ๊ฒฐ์ ๋๋ค.
- ์์(-1): ํ์ฌ ๊ฐ์ฒด(this)๊ฐ ๋น๊ต ๊ฐ์ฒด๋ณด๋ค ์์. (์ค๋ฆ์ฐจ์์์ ํ์ฌ ๊ฐ์ฒด๊ฐ ์์ ์์น)
- 0: ํ์ฌ ๊ฐ์ฒด(this)์ ๋น๊ต ๊ฐ์ฒด๊ฐ ๊ฐ์.
- ์์(1): ํ์ฌ ๊ฐ์ฒด(this)๊ฐ ๋น๊ต ๊ฐ์ฒด๋ณด๋ค ํผ. (์ค๋ฆ์ฐจ์์์ ํ์ฌ ๊ฐ์ฒด๊ฐ ๋ค์ ์์น)
Integer๋ฅผ ์๋ก ๋ณด์๋ฉด
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
๋งค๊ฐ ๋ณ์๋ก ๋์ด์ค๋ ๊ฐ์ฒด์ธ y๊ฐ ์๊ธฐ ์์ ๋ณด๋ค ํด ๋๋ -1์ ๋ฐํ → ์์น ์ด๋์ด ๋ฐ์, x๊ฐ ์์ผ๋ก ๊ฐ.
y์ ๊ฐ์ ๋๋ 0์ ๋ฐํ → ์์น์ด๋ X
y๋ณด๋ค x๊ฐ ํด ๋๋ 1์ ๋ฐํ → ์์น์ด๋X
public class Main {
public static void main(String[] args) {
Integer x = 3;
Integer y = 4;
Integer[] testInt = new Integer[2];
testInt[0] = y; // 4
testInt[1] = x; // 3
System.out.println( x.compareTo(y) ); // -1
System.out.println( x.compareTo(3) ); // 0
System.out.println( x.compareTo(2) ); // 1
Arrays.sort(testInt);
Arrays.stream(testInt).forEach(System.out::print); //34
}
}
⇒ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ ๊ฒ ์ค๋ฆ์ฐจ์์ด ์ด๋ค์ง๋ค.
์ด ๋ฉ์๋์ ์ ๋ ฌ์ ๋ฐํ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ๋ ๊ฒ์ด๋ฏ๋ก ์ด ๋ฐํ ๊ฐ์ ๋น๊ต ์กฐ๊ฑด์ ๋ฐ๊ฟ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ณ๊ฒฝํ ์๋ ์๋ค.
( ์๊ธฐ ์์ , ๋งค๊ฐ ๋ณ์ ) → ( ๋งค๊ฐ ๋ณ์, ์๊ธฐ ์์ ) ์ด๋ ๊ฒ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ๋ด๋ฆผ์ฐจ์์ด ๋ ๊ฒ์ด๋ค.
๐กComparable ์์ฉ๋ฒ (Student ์์)
class Student {
private String name;
private int score;
public Student(Stinrg name, int score){
this.name = name;
this.score = score;
}
}
Student๋ผ๋ ๋ด๊ฐ ๋ง๋ ๊ฐ์ฒด๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("ํ๊ธธ๋"), 60);
students.add(new Student("์ดํ์จ"), 80);
students.add(new Student("๊น์ฒ ์"), 40);
students.stream()
.sorted()
.collect(Collectors.toList())
.forEach(System.out::println);
๋ฐฐ์ด์ ๋ด์์ Collections.sort()๋ฅผ ํตํด ์ ๋ ฌ์ ์๋ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๐๐ป ์ฌ์ฉ์ ์ ์ ํด๋์ค ๊ฐ์ฒด์ธ Student ๊ฐ์ฒด์ ์ ๋ ฌ ๊ธฐ์ค์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
public class Student implements Comparable<Student>{
private String name;
private int score;
public Student(String name, int score){
this.name = name;
this.score = score;
}
@Override
public int compareTo(Student ohter) {
return this.score - this.other;
// return this.other - this.score;
}
}
Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ , compareTo๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ์ ํด์ค๋ค.
this.score - this.other๋ฅผ ํด์ฃผ๋ฉด ๊ธฐ์กด ๋ฐํ๊ฐ์ ์กฐ๊ฑด ๋๋ก ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ณ , ์ค๋ฆ์ฐจ์์ด ๋ ๊ฒ์ด๋ค.
this.other - this.score๋ฅผ ํด์ฃผ๋ฉด ๊ธฐ์กด ๋ฐํ๊ฐ์ ์กฐ๊ฑด์ ๋ฐ๋๋ก ๋ค์ง์๊ธฐ ๋๋ฌธ์ ๋ด๋ฆผ์ฐจ์์ด ๋ ๊ฒ์ด๋ค.
๊ตณ์ด if๋ก ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๊ณ , ์ฐ์ฐ์ ํตํด ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์๊ฒ๋ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
2. Comparator
public interface Comparator<T> {
int compare(T o1, T o2);
}
์ค์ Comparator ์ธํฐํ์ด์ค ์ฝ๋์ด๋ค. ๋ด๋ถ์ ์ฌ๋ฌ ๋ฉ์๋ ์ค์ compare๋ฉ์๋๋ฅผ ํฌํจํ๊ณ ์๋ค.
compare ๋ฉ์๋๋ฅผ ํตํด ์ ๋ ฌ ๊ธฐ์ค์ ์ ์ํ ์ ์์ผ๋ฏ๋ก ๋ฐ๋์ ๊ตฌํ์ฒด์ ํด๋น ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ผํ๋ค.
ํ๋ผ๋ฏธํฐ์์ ์ ์ ์๋ฏ์ด, ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ฃผ๋ก ํด๋์ค๊ฐ Comparable์ ๊ตฌํํ์ง ๋ชปํ๋ ์ํฉ์ด๊ฑฐ๋ ๊ธฐ๋ณธ ์ ๋ ฌ ์์ ์ธ์ ๋ค๋ฅธ ์์๋ก ์ ๋ ฌํ๊ณ ์ ํ ๋ (์ฌ๋ฌ ์ ๋ ฌ ๊ธฐ์ค์ด ํ์ํ ๋) ์ฌ์ฉ๋๋ค.
๐ ๐ปโ๏ธ Comparable์ ๊ตฌํํ์ง ๋ชปํ๋ ์ํฉ
1. ์ธ๋ถ ํด๋์ค ์์ ๋ถ๊ฐ์ ์ํฉ
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ API์ ํด๋์ค๋ ์ง์ ์์ ํ ์๊ฐ ์๋ค. ์ด๋ฐ ํด๋์ค์๋ Comparable์ ๊ตฌํํ ์ ์๋ค.
// Comparable์ ๊ตฌํํ ์ ์์ผ๋ฏ๋ก Comparator๋ฅผ ์ฌ์ฉ
Collections.sort(list, new Comparator<ExternalClass>() {
@Override
public int compare(ExternalClass o1, ExternalClass o2) {
return Integer.compare(o1.value, o2.value);
}
});
์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋ค.
2. ์์ฐ ์์๋ฅผ ์ ์ํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ
๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ํน์ ํ ๋น๊ต ๊ธฐ์ค์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ์์ฐ ์์๋ฅผ ์ ์ํ๊ธฐ ์ด๋ ต๋ค.
3. ์์ ๊ตฌ์กฐ๋ก ์ธํ ์ ์ฝ
ํด๋์ค๊ฐ ์ด๋ฏธ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ์๊ฑฐ๋, ๋ค์ค ์์์ด ๋ถ๊ฐ๋ฅํ ์๋ฐ์์๋ ์ถ๊ฐ์ ์ผ๋ก Comparable์ ๊ตฌํํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ์ ์๋ค.
4. ๋ค๋ฅธ ๋ฐฉ์์ ๋น๊ต๊ฐ ํ์ํ ๊ฒฝ์ฐ
๋น๊ต๊ฐ ํน์ ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ, ์ฆ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋น๊ตํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ์ด๋ด ๋๋ Comparable๋ณด๋ค Comparator๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ์ฐํ๊ณ ์ ์ ํ๋ค.
compare() ์ฌ์ฉ๋ฒ
๋น๊ต ๊ธฐ์ค | ๋ฐํ ๊ฐ |
o1 > o2 (์ฐ์ ์์๊ฐ ๋์ ๊ฒฝ์ฐ ํฌํจ) | ์์ |
o1 = o2 | 0 |
o1 < o2 (์ฐ์ ์์๊ฐ ๋ฎ์ ๊ฒฝ์ฐ ํฌํจ) | ์์ |
- ์์: o1์ด o2๋ณด๋ค ์์ ์์ผ ํจ (์ค๋ฆ์ฐจ์์์ o1์ด ๋ ์์)
- 0: o1๊ณผ o2๊ฐ ๊ฐ์
- ์์: o1์ด o2๋ณด๋ค ๋ค์ ์์ผ ํจ (์ค๋ฆ์ฐจ์์์ o1์ด ๋ ํผ)
๋ฐํ ๊ฐ์ ๋ฐ๋ฅธ ์ ๋ ฌ์ ์ค๋ฆ์ฐจ์์ด๋ฉฐ, ํฐ ๋ฉ์ปค๋์ฆ์ compareTo()์ ๊ฐ๋ค.
๋จ์ง ์๊ธฐ ์์ ๊ณผ ๋น๊ต๊ฐ ์๋๋ผ ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
๐กComparator ์์ฉ๋ฒ (Person ์์)
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
๋ด๊ฐ ๋ง๋ Person ๊ฐ์ฒด๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
Person ๊ฐ์ฒด๋ฅผ ๋์ด๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ , ๋์ด๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ด๋ฆ์ ์ค๋ฆ์ฐจ์(์ฌ์ ์)์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ๋ค.
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
// ๋จผ์ ๋์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ๋น๊ต
int ageComparison = Integer.compare(p2.age, p1.age);
if (ageComparison != 0) {
return ageComparison;
}
// ๋์ด๊ฐ ๊ฐ๋ค๋ฉด ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ๋น๊ต
return p1.name.compareTo(p2.name);
}
}
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
// ๋์ด๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋น๊ต
if (p1.age != p2.age) {
return p2.age - p1.age; // ๋์ด๊ฐ ํฐ ์์๋๋ก
}
// ๋์ด๊ฐ ๊ฐ๋ค๋ฉด ์ด๋ฆ์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋น๊ต
return p1.name.compareTo(p2.name); // ์ด๋ฆ์ด ์ฌ์ ์์ผ๋ก
}
}
์ด๋ฐ ์์ผ๋ก compare์์ ์๋ง์ ๋ถ๊ธฐ์ฒ๋ฆฌ ํ์ ๋ฐํ ๊ฐ์ ๋ฐํํด์ฃผ๋ฉด ๋๋ค.
- ์์์ ๋ค๋ฃฌ ๋ด์ฉ์ฒ๋ผ compare์ ๋น๊ต๊ฐ ์์๋ฅผ ๋ฐ๊ฟ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ง๋ค์ด์ค๋ค. or ๋นผ๊ธฐ ์ฐ์ฐ์ผ๋ก ๊ตฌํํ๋ค.
- ๊ฐ์ด ๊ฐ์ง ์๋ค๋ฉด ๊ทธ๋๋ก ๊ฐ์ ๋ฐํํ๊ณ , ๋์ด๊ฐ ๊ฐ๋ค๋ฉด ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ ๋น๊ตํ ์ ์๋๋ก compareTo๋ฅผ ์ฌ์ฉํ๋ค.
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 35));
people.add(new Person("David", 30));
people.add(new Person("Eve", 25));
// ๋์ด ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์, ์ด๋ฆ ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
Collections.sort(people, new PersonComparator());
System.out.println(people);
// [Charlie (35), Alice (30), David (30), Bob (25), Eve (25)]
}
}
์ด๋ฐ ์์ผ๋ก ํ์ฉํ ์ ์๊ฒ ๋๋ค.
๐ ์ฐธ๊ณ ๊ธ
https://haon.blog/java/comparable-comparator/
์ค๋ผ์ ์ฑgpt