β λλ€μ 리ν©ν λ§ νκΈ° (Comparator μΆμ½ μ리)
Comparator λλ€μ 리ν©ν λ§ ν΄λ³΄κΈ°
λ€μμ μ€μ λ‘ μλ° νλ‘κ·Έλλ°μμ λ°°μ΄μ μ λ ¬(sort) ν λ μ¬μ©λλ Comparator μΈν°νμ΄μ€ μ¬μ© μμ μ΄λ€.
Apple ν΄λμ€κ° μκ³ μμ±μ μΈμλ‘ μ¬κ³Όμ 무κ²(weight)κ°μ λ°λλ€. κ·Έλ¦¬κ³ μ€νλΆμμ λ°°μ΄λ‘ μ¬κ³Ό κ°μ²΄λ₯Ό λ΄κ³ , μ¬κ³Ό 무κ²μ λ°λΌ λ°°μ΄ μμλ€μ μ λ ¬νλ €κ³ νλ€. μ΄λ₯Ό μ½λλ‘ κ΅¬ννλ©΄ μλμ κ°μ΄ ꡬνν μ μλ€.
class Apple {
private final int weight; // μ¬κ³Ό 무κ²
public Apple(int weight) {
this.weight = weight;
}
public int getWeight() {
return weight;
}
@Override
public String toString() {
return "Apple{" + "weight=" + weight + '}';
}
}
public class Main {
public static void main(String[] args) {
Apple[] inventory = new Apple[] {
new Apple(34),
new Apple(12),
new Apple(76),
new Apple(91),
new Apple(55)
};
Arrays.sort(inventory, new Comparator<Apple>() {
@Override
public int compare(Apple o1, Apple o2) {
return Integer.compare(o1.getWeight(), o2.getWeight());
}
});
System.out.println(Arrays.toString(inventory));
}
}
λ°°μ΄μ μΆλ ₯ν΄λ³΄λ, μ¬κ³Ό κ°μ²΄λ€μ΄ 무κ²μ λ°λΌ μμλλ‘ μ λ ¬λ¨μ λ³Ό μ μλ€.
νμ§λ§ μΈν 리μ μ΄μ κ°μ IDEλ₯Ό μ΄λ€λ©΄, Comparator μ΅λͺ ꡬν ν΄λμ€λ₯Ό λλ€ννμμΌλ‘ 리ν©ν λ§ νλΌκ³ μ‘°μΈμ ν΄μ€ κ²μ΄λ€.
κ·Έλ°λ° λλ€μμΌλ‘ λ³ννλλ μ΄λ²μ λ λ³ννλΌκ³ IDEμμ μ‘°μΈν΄μ€λ€.
λ³νν΄λ³΄λ νμ€ν κΈ°μ‘΄ λλ€μ λ³΄λ¨ μ½λ μ€μ΄ νμ°ν μ€μμμ λ³Ό μ μλ€. κ·Έλ°λ° κ°μκΈ° μ©λ±λ§κ² Comparatorμ μ μ λ©μλλ₯Ό νΈμΆνκ³ κ·Έ μμλ λλ€μ λ©μλ μ°Έμ‘° λ¬Έλ²μ μ¨ λμλ€. λ체 μ΄λ€ μλ¦¬λ‘ λλ€ννμμ μ΄λ κ² μΆμ½μ ν μ μλμ§ κ°λ μ΄ μκ°λ€.
μ€μ λ‘ μ΄λ μ€μ μμ μ λ§ λ§μ΄ μ°μ΄λ κΈ°λ²μΈλ°, λ¨μνκ² μκΈ°νκ³ λκΈ°μ§ λ§κ³ μ μ λ°μμΌλ‘ μ€μΌ μ μλμ§ μ§κΈλΆν° νλνλ νν€μ³ 보μ.
Comparatorμ μΆμ½ μ리 νν€μΉκΈ°
μ°μ ν΄λΉ λλ€μμ λ©μλ μ°Έμ‘°λ‘ λ¬Έλ²μ μΌλ‘ μλ΅μ΄ λΆκ°λ₯ νλ€.
Arrays.sort(inventory, (o1, o2) -> Integer.compare(o1.getWeight(), o2.getWeight()));
λ§μΌ (a1, a2) -> Integer.compare(a1, a2) μ²λΌ λμ΄μμΌλ©΄ Integer::compare λ‘ μλ΅ν μ μμκ² μ§λ§, 맀κ°λ³μκ° Integer.compare λ©μλμ μΈμλ‘ κ·Έλλ‘ λ€μ΄κ°κ² μλλΌ λ³λλ‘ λ©μλλ₯Ό νΈμΆνκ³ μκΈ° λλ¬Έμ΄λ€.
κ·Έλ¬λ©΄ μμν μ½λ μμ μ€μΌμ μλκ² μΈκ°?
μκ°μ νκΈ° μμΌλ³΄λ©΄ ν΄λ΅μ κ°λ¨νλ€. λ°λ‘ λλ€ ν¨μ μ체λ₯Ό λ©μλκ° λ°ννλλ‘ λ§λ€λ©΄ λλ€.
λλ€ ν¨μμμ μΌκΈ κ°μ²΄λ‘ μ·¨κΈλλ€. μΌκΈ κ°μ²΄μ νΉμ§μΌλ‘λ λ³μμ ν¨μλ₯Ό ν λΉν μ μκ³ ν¨μλ₯Ό 리ν΄κ°μΌλ‘λ νμ©ν μ μλ€. λνμ μΌλ‘ μλ°μ€ν¬λ¦½νΈμ ν¨μκ° λ³μμ λ£κ±°λ μ체 ν¨μλ₯Ό λ°ννλ κΈ°λ²μ μ¬μ©νλ€.
μ¦, μ΄λ¬ν νΉμ±μ μ΄μ©ν΄ λ³λμ μ μ λ©μλλ₯Ό λ§λ€κ³ , κ·Έ λ©μλκ° νΉμ λλ€ ν¨μμμ 리ν΄νλλ‘ ν΄μ£Όλ©΄, κΈΈλ€λ λλ€μμ λ¨μν λ©μλ νΈμΆ μ½λλ‘ μ€μΌμ μλ κ²μ΄λ€. κ·Έλμ μ°μ κ°λ¨νκ² νλ‘ν νμ μΌλ‘ λλ€μμ λ°ννλ μ μ λ©μλλ₯Ό μμ±ν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ λκ² λ€.
public class Main {
public static Comparator<Apple> comparingInt() {
// λλ€μμ Comparator μΈν°νμ΄μ€ νμ
μΌλ‘ λ°ν
return (a1, a2) -> Integer.compare(a1.getWeight(), a2.getWeight());
}
public static void main(String[] args) {
Apple[] inventory = new Apple[]{
new Apple(34),
new Apple(12),
new Apple(76),
new Apple(91),
new Apple(55)
};
Arrays.sort(inventory, comparingInt()); // λ¨μν λ©μλ νΈμΆλ‘ μλ΅ν¨ (κ°λ
μ± ↑)
System.out.println(Arrays.toString(inventory));
}
}
ꡬνν λ©μλλ₯Ό μ’ λ μ¬μ©μ± μ’κ² λ°κΏλ³΄μ. μ§κΈμ Apple κ°μ²΄μ weight κ°λ§ λ€λ£¨λκΉ μ λ κ² μμ±ν΄λ λμ§λ§, λμ€μ Banana κ°μ²΄μ prize κ°μΌλ‘ μ λ ¬ν μλ μλ κΈ°λ₯μ νμ₯ν μ λ μλ€. λ°λΌμ μΈλΆμ μν΄ λ°λμ μλ λΆλΆμΈ a.getWeight() λΆλΆμ 맀κ°λ³μν νμ¬ μ²λ¦¬νλλ‘ νλ©΄ λλ€.
κ·Έλ°λ° a.getWeight() λ λ¨μν λ°μ΄ν°κ° μλ ν¨μλ₯Ό νΈμΆνλ μ½λ λ‘μ§μ΄λ€. μ΄λ₯Ό μ΄λ»κ² 맀κ°λ³μν νλ©΄ λλ κ²μΌκΉ?
μ°λ¦¬λ μλ° λλ€μ λν΄ λ°°μ°κ³ μλ€. νλΌλ―Έν°λ‘ λ€μ΄μ¬ κ°μ λ°λμ μ μλ λ¬Έμμ΄κ³Ό κ°μ κ³ μ λ λ°μ΄ν°λ§ λ€μ΄μ€λΌλ λ²μ μλ€. μ¦, a.getWeight() λ₯Ό 리ν΄νλ λλ€μμΌλ‘ 맀κ°λ³μν νμ¬ ν¨μν μΈν°νμ΄μ€λ‘ λ°μΌλ©΄ λλ κ²μ΄λ€.
μ΄μ μ΄λ ν ν¨μν μΈν°νμ΄μ€ νμ
μ 맀κ°λ³μμ νμ
μΌλ‘ μ ν΄μΌ ν μ§ κ³ λ―Όν΄μΌ λλλ°, Apple νμ
μ κ°μ²΄λ₯Ό νλΌλ―Έν°λ‘ λ°μ int κ°μΈ 무κ²λ₯Ό λ°ννκΈ° λλ¬Έμ μ¬κΈ°μ μ μ ν ν¨μν μΈν°νμ΄μ€λ ToIntFunction<Apple> μ΄λ€.
public static Comparator<Apple> comparingInt(ToIntFunction<Apple> keyExtractor) {
// 맀κ°λ³μλ‘ λλ€μμ λ°μμ μΆμ λ©μλ μ€ν : keyExtractor.applyAsInt(a1) == a1.getWeight()
return (a1, a2) -> Integer.compare(keyExtractor.applyAsInt(a1), keyExtractor.applyAsInt(a2));
}
λ§μ§λ§μΌλ‘ λ€λ₯Έ μ λ€λ¦ νμ λ λ°μμ μκ² νμ νλΌλ―Έν°λ₯Ό T κΈ°νΈλ‘ λ°κΏμ£Όλ©΄ μμ±μ΄λ€.
κ·Έλ¦¬κ³ (a) -> a.getWeight() λλ€μμ λ©μλ μ°Έμ‘°λ‘ Apple::getWeight λ‘ μΆμ½μ΄ κ°λ₯νλ μ΅μ’
μμ±λ³Έμ λ€μκ³Ό κ°λ€.
public class Main {
public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {
return (a1, a2) -> Integer.compare(keyExtractor.applyAsInt(a1), keyExtractor.applyAsInt(a2));
}
public static void main(String[] args) {
Apple[] inventory = new Apple[]{
new Apple(34),
new Apple(12),
new Apple(76),
new Apple(91),
new Apple(55)
};
Arrays.sort(inventory, comparingInt(Apple::getWeight)); // (a) -> a.getWeight()
System.out.println(Arrays.toString(inventory));
}
}
μ€μ Comparatorμ λΉκ΅νκΈ°
μ€μ μλ°μ μ μλμ΄ μλ Compator μΈν°νμ΄μ€μ comparingInt() λ©μλ μκ·Έλμ²λ₯Ό 보면 μ§κΈκΉμ§ μ°λ¦¬κ° ꡬνν κ²κ³Ό λ³λ° μ°¨μ΄κ° μλ κ²μ λ³Ό μ μλ€.
Arrays.sort(inventory, Comparator.comparingInt(Apple::getWeight));
μ΄λ°μμΌλ‘ λλ€μμ΄ μ€νλ € μ½λμ κ°λ μ±μ ν΄μΉλ€κ³ μκ°νλ©΄ μ κΈ κ°μ²΄μ νΉμ±μ μ΄μ©νμ¬ λ©μλλ‘ λλ€μμ λ°ννλλ‘ κ΅¬μ±ν΄μ€μΌλ‘μ¨ μ½λμμ΄ λ¨μν λ©μλ νΈμΆλ‘ ꡬμ±ν΄μ€λ€λ©΄ λ³΄λ€ ν΄λ¦°ν 리ν©ν λ§ μ½λκ° λ κ²μ΄λ€.