String, Integer, Double ๋ฑ ํด๋์ค ๋ด๋ถ์๋ ๋ชจ๋ compare ๋ฉ์๋๊ฐ ๋ด์ฅ ๋์ด์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๊ณตํ๊ณ ์๋ค. ๋ง์ฝ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ์ ํ๊ณ ์ถ๋ค๋ฉด, ๋งค๊ฐ๋ณ์์ ์์๋ฅผ ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
์ด int compare ๋ฉ์๋๋ฅผ ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด, ์ ๋ ฌ์ด ์งํ๋ ๋ ์๋ฆฌ๋ฐ๊ฟ(=์ ๋ ฌ) ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฐ์ ๋๊ฒจ์ฃผ๋ ์ญํ ์ ํ๋ค.
๋ง์ฝ return๊ฐ์ด 0์ด๋ ์์์ด๋ฉด ์๋ฆฌ๋ฐ๊ฟ์ ํ์ง ์๊ณ , ์์์ด๋ฉด ์๋ฆฌ๋ฐ๊ฟ์ ์ํํ๋ค.
๋ง์ฝ ์ค๋ฆ์ฐจ์์ด ์๋๋ผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ๋ค๋ฉด ๋งค๊ฐ๋ณ์์ ์์๋ฅผ ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
compare ๋ฉ์๋ ์ฝ๋
@Override
public static int compare(int x, int y) {
return x < y ? -1 : ((x == y) ? 0 : 1);
}
์ฌ์ฉ ์ :
int a = 10;
int b = 5;
System.out.println(Integer.compare(a, b)); // 1
1) Comparable ์ธํฐํ์ด์ค
- ์ ์: ์ ๋ ฌ ์ํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋๋ ์ ๋ ฌ ๊ธฐ์ค์ด ๋๋ ๋ฉ์๋๋ฅผ ์ ์ํด ๋๋ ์ธํฐํ์ด์ค์ด๋ค.
- ์ฌ์ฉ๋ฒ: Comparable ์ธํฐํ์ด์ค๋ฅผ implements ํ ๋ค, ๋ด๋ถ์ ์๋ compareTo ๋ฉ์๋๋ฅผ ์ํ๋ ์ ๋ ฌ ๊ธฐ์ค๋๋ก ๊ตฌํํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
- ํจํค์ง: java.lang.Comparable
- ์๋ฐ์์ ์ ๊ณต๋๋ ์ ๋ ฌ์ด ๊ฐ๋ฅํ ํด๋์ค๋ค์ ๋ชจ๋ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์์ผ๋ฉฐ, ์ ๋ ฌ์์ Comparable์ ๊ตฌํ ๋ด์ฉ์ ๋ง์ถฐ ์ ๋ ฌ์ด ์ํ๋๋ค.
์๋ฅผ๋ค์ด Integer, Double ๋ฑ์ ํด๋์ค์ ๊ฒฝ์ฐ ๋น ๋ด๋ฆผ์ฐจ์(์ค๋ฆ์ฐจ์๊ณผ ์ ์ฌ), String ํด๋์ค์ ๊ฒฝ์ฐ ์ฌ์ ์์ผ๋ก ์ ๋ ฌ๋๊ฒ ๊ตฌํ๋์ด ์๋ค.
public class Car implements Comparable<Car> {
private String car;
private int price;
public Car(String name , int price){
this.name = name;
this.price = price;
}
// getter, setter method ...
@Override
public int compareTo(Car car){
int comparePrice = car.getPrice();
return this.price - comparePrice;
}
}
import java.util.Arrays;
public class CarTestDrive
{
public static void main(String[] args)
{
Car[] cars = new Car[3];
cars[0] = new Car("Genesis", 1000);
cars[1] = new Car("Sonata" , 600);
cars[2] = new Car("Avante" , 300);
Arrays.sort(cars);
for(Car car : cars){
System.out.println(car.getName());
}
}
}
์คํ ๊ฒฐ๊ณผ (์ค๋ฆ์ฐจ์)
Avante
Sonata
Genesis
๋ง์ฝ, ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ๋ค๋ฉด, ์ค๋ฒ๋ผ์ด๋ฉํ compareTo๋ฉ์๋ return๊ฐ์ ์์๋ก ์ค๋ฒ๋ฆฌ๋ฉด ๋๋ค.
public int compareTo(Car car){
int comparePrice = car.getPrice();
return -(this.price - comparePrice);
//๋๋ comparePrice - this.price; ์ด๋ ๊ฒ ๋ฐ๋๋ก ํด์ค๋ ๋๋ค.
}
์ด๋ ๊ฒ ์คํํ๋ฉด, ์๋์ ๊ฒฐ๊ณผ์ฒ๋ผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋์จ๋ค.
Genesis
Sonata
Avante
2) Comparator ํด๋์ค
- ์ ์: ์ ๋ ฌ ๊ฐ๋ฅํ ํด๋์ค(=Comparable์ด ๊ตฌํ๋ ํด๋์ค)๋ค์ ๊ธฐ๋ณธ ์ ๋ ฌ ๊ธฐ์ค๊ณผ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ํด๋์ค์ด๋ค.
- ์ฌ์ฉ๋ฒ: Comparator ํด๋์ค๋ฅผ ์์ฑํ์ฌ, ๋ด๋ถ์ compare๋ฉ์๋๋ฅผ ์ํ๋ ์ ๋ ฌ ๊ธฐ์ค๋๋ก ๊ตฌํํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
- ํจํค์ง: java.util.Comparator
- ์ฃผ๋ก ์ต๋ช
ํด๋์ค(new Comparator(){ ... })๋ก ์ฌ์ฉ๋๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฆ์ฐจ์์ด ์ ๋ ฌ ๊ธฐ์ค์ธ ๊ฒ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ๋ฑ์ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
import java.util.Arrays;
import java.util.Comparator;
public class CarTestDrive
{
public static void main(String[] args)
{
Car[] cars = new Car[3];
cars[0] = new Car("Genesis", 1000);
cars[1] = new Car("Sonata" , 600);
cars[2] = new Car("Avante" , 300);
Arrays.sort( cars , new Comparator<Car>() {
@Override
public int compare(Car car1, Car car2){
return car1.getName().compareTo(car2.getName());
}
});
for(Car car : cars){
System.out.println(car.getName());
}
}
}
์คํ ๊ฒฐ๊ณผ
Avante
Genesis
Sonata
๋ง์ฝ, ์ขํ์ ํฌ๊ธฐ๋ฅผ ๋น๊ต ํ๋ค๋ฉด?
(1, 2) ์ (1, 1)์ ์ค๋ฆ ์ฐจ์์ผ๋ก ์ ๋ ฌ์ ํ ๊ฒฝ์ฐ. (x๊ฐ ์์ ์์๋ก, x๊ฐ ๊ฐ์ ๋๋ y๊ฐ ์์ ์์)
์ ๋ ฌ ์
1 2
1 1
---------
์ ๋ ฌ ํ
1 1
1 2
์ด๋ด ๊ฒฝ์ฐ์๋ Comparator ๋ฅผ ๊ตฌํ ํ๋ฉด ๋๋ค.
public class Main {
public static void main(String[] args) {
Dot[] dots = new Dot[2];
dots[0] = new Dot(1, 2);
dots[1] = new Dot(1, 1);
Arrays.sort(dots, new Comparator<Dot>() {
@Override
public int compare(Dot o1, Dot o2) {
if (o1.getX() == o2.getX()) { // ๋ง์ฝ, x๊ฐ ๊ฐ์ผ๋ฉด
return Integer.compare(o1.getY(), o2.getY()); // y๋ฅผ ๋น๊ตํ๋ค.
}
return Integer.compare(o1.getX(), o2.getX()); // o1.x๊ฐ ํฌ๋ฉด ์๋ฆฌ๋ฅผ ๋ฐ๊พผ๋ค.
}
});
}
public static class Dot {
int x , y;
public Dot(int x, int y){
this.x = x;
this.y = y;
}
//getter, setter
}
}