ITEM 14: Consider implementing comparable
public interface Comparable<T> {
/**
* μ΄κ°μ²΄μ μ£Όμ΄μ§ κ°μ²΄μ μμλ₯Ό λΉκ΅
* κ°μ²΄κ° μ£Όμ΄μ§ κ°μ²΄λ³΄λ€ μμΌλ©΄ μμ μ μ
* κ°μΌλ©΄ 0
* ν¬λ©΄ μμ μ μλ₯Ό λ°ν
* λΉκ΅ν μ μλ νμ
μ κ°μ²΄κ° μ£Όμ΄μ§λ©΄ ClassCastException
*/
public int compareTo(T o);
}Comparable μ λ¨μ λμΉμ± λΉκ΅μ μμ λΉκ΅λ₯Ό ν μ μλ Generic μΈν°νμ΄μ€μ΄λ€. Comparableμ ꡬνν ν΄λμ€μ μΈμ€ν΄μ€μλ μμ°μ μΈ μμκ° μμμ λ»νλ©°, Comparableμ ꡬνν κ°μ²΄λ€μ λ°°μ΄μ λ€μκ³Ό κ°μ΄ μ½κ² μ λ ¬ν μ μλ€.
Arrays.sort(a);// Stringμ Comparableμ ꡬνν¨
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
...
}μ¬μ€μ μλ° νλ«νΌ λΌμ΄λΈλ¬λ¦¬μ λͺ¨λ κ° ν΄λμ€μ μ΄κ±°νμ
μ΄ Comparableμ ꡬννμΌλ©°, μνλ²³, μ«μ, μ°λ κ°μ΄ μμκ° λͺ
νν κ° ν΄λμ€λ₯Ό μμ±νλ€λ©΄ Comparable μΈν°νμ΄μ€λ₯Ό ꡬννλ κ²μ΄ μ’λ€.
compareTo λ©μλ μΌλ° κ·μ½
sgnμ signum functionμ λ»νκ³ , ννμμ κ°μ΄ μμ, 0, μμμΌ λ -1, 0, 1μ λ°ννλλ‘ μ μ
sgn(x.compareTo(y)) == -sgn(y.compareTo(x))x.compareTo(y) > 0 && y.compareTo(z) > 0μ΄λ©΄x.compareTo(z) > 0μ΄λ€.x.compareTo(y) == 0μ΄λ©΄sgn(x.compareTo(z)) == sgn(y.compareTo(z))μ΄λ€.(x.compareTo(y) == 0 ) == (x.equals(y))μ¬μΌνλ€. (μ΄ κΆκ³ λ νμλ μλμ§λ§ κΌ μ§ν€λκ² μ’μΌλ©°, λ§μ½ μ§ν€μ§ μμλ€λ©΄ μ΄ ν΄λμ€μ μμλequalsλ©μλμ μΌκ΄λμ§ μλ λ€λ κ²μ λͺ μν΄μΌνλ€.)
compareTo κ·μ½μ μ§ν€μ§ λͺ»νλ©΄ λΉκ΅λ₯Ό νμ©νλ ν΄λμ€(TreeSet, TreeMap, Collections, Arrays)λ₯Ό νμ©νμ§ λͺ»νλ€.
4λ² κ·μ½μ μ§ν€μ§ μμ μ¦, compareToμ equalsμ κ²°κ³Όκ° μΌκ΄λμ§ μμ κ²½μ°μλ μ΄ ν΄λμ€μ κ°μ²΄λ₯Ό μ λ ¬λ 컬λ μ
μμ μλμΉ μμ λμμ ν μ μλ€.
public static void main(String[] args) {
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");
Set<BigDecimal> hs = new HashSet<>();
hs.add(a);
hs.add(b);
System.out.println(hs.size()); // 2
Set<BigDecimal> ts = new TreeSet<>();
ts.add(a);
ts.add(b);
System.out.println(ts.size()); // 1
}HashSetμ equals λ©μλλ‘ λΉκ΅λ₯Ό νκΈ°λλ¬Έμ HashSetμ μμλ 2κ°μ΄κ³ , TreeSetμ compareTo λ©μλλ‘ λΉκ΅νκΈ° λλ¬Έμ μμμ κ°μλ 1κ°μ΄λ€.
Comparableμ νμ
μ μΈμλ‘ λ°λ μ λ€λ¦ μΈν°νμ΄μ€λ‘, compareTo λ©μλμ μΈμ νμ
μ μ»΄νμΌνμμ μ ν΄μ§λ€. μΈμ νμ
μμ²΄κ° μλͺ»λλ€λ©΄, μ»΄νμΌ μμ²΄κ° λμ§ μμΌλ©°, nullμ μΈμλ‘ λ£μ΄ νΈμΆνλ€λ©΄ NullPointerExeptionμ΄ λ°μν κ²μ΄λ€. compareToλ κ° νλκ° λμΉμΈμ§ λΉκ΅νλ κ²μ΄ μλ μμλ₯Ό λΉκ΅νλ€.
compareTo λ©μλμμ κ΄κ³ μ°μ°μ <μ > λ₯Ό μ¬μ©νλ λ°©μμ μΆμ²νμ§ μμΌλ©°, μλ°7λΆν° λ°μ±λ κΈ°λ³Έ νμ
ν΄λμ€λ€μ μλ‘ μΆκ°λ compareμ μ΄μ©νλ©΄ λλ€.
ν΄λμ€μ ν΅μ¬ νλκ° μ¬λ¬ κ°λΌλ©΄ κ°μ₯ ν΅μ¬μ μΈ νλλΆν° λΉκ΅ν΄μΌνλ€. λΉκ΅ κ²°κ³Όκ° 0μ΄ μλλΌλ©΄(μμκ° μ ν΄μ§λ€λ©΄) λ°ννλ©΄ λλ€.
public int compareTo(PhoneNumber pn){
int result = Short.compare(areaCode, pn.areaCode);
if(result == 0){
result = Short.compare(prefix, pn.prefix);
if(result == 0){
result = Short.compare(lineNum, pn.lineNum);
}
}
return result;
}μλ° 8μμλ Comparator μΈν°νμ΄μ€λ₯Ό νμ©ν΄μ ꡬνν μ μλ€.
private static final Comparator<PhoneNumber> COMPARATOR = Comparator.comparingInt((PhoneNumber pn) -> pn.areaCode).thenComparingInt(pn -> pn.lineNum).thenComparingInt(pn -> pn.prefix);
public int compareTo(PhoneNumber pn){
return COMPARATOR.compare(this, pn);
}μ΄ λ°©μμ κ°κ²°νμ§λ§ ,μ½κ°μ μ±λ₯μ νκ° λ€λ°λ₯Έλ€. Comparatorλ μλ°μ μ«μμ© κΈ°λ³Έ νμ
μ λͺ¨λ 컀λ²ν μ μλ€.
λΉκ΅μ μ£Όμ μ¬ν
static Comparator<Object> hashCodeOrder = new Comparator<>() {
public int compare(Object o1, Object o2) {
return o1.hashCode() - o2.hashCode();
}
};λ€μ λ°©μμ μ μ μ€λ²νλ‘μ°λ, λΆλμμμ κ³μ° λ°©μμ λ°λ₯Έ μ€λ₯λ₯Ό λΌ μ μμΌλ©°, μ±λ₯ λν μλ±ν λΉ λ₯΄μ§ μκΈ° λλ¬Έμ μ¬μ©νλ©΄ μλλ€. μλ λ λ°©μμ€ νλλ‘ κ΅¬ννλ κ²μ κΆμ₯νλ€.
μ μ compare λ©μλ νμ©
static Comparator<Object> hashCodeOrder = new Comparator<>() {
public int compare(Object o1, Object o2){
return Integer.compare(o1.hashCode(), o2.hashCode());
}
}λΉκ΅μ μμ± λ©μλ νμ©
static Comparator<Object> hashCodeOrder = Comparator.comparingInt(o->o.hashCode);μ 리νμ§λ©΄ λ€μκ³Ό κ°λ€.
μμλ₯Ό κ³ λ €νλ κ° ν΄λμ€ μμ±μ
ComparableμΈν°νμ΄μ€λ₯Ό ꡬνν΄ ν΄λΉ μΈμ€ν΄μ€λ₯Ό μ½κ² μ λ ¬, κ²μ, λΉκ΅ν μ μλ 컬λ μ κ³Ό μ΄μ°λ¬μ§λλ‘ ν΄μΌ νλ€.compareToλ©μλμμ νλ κ° λΉκ΅μ<,>μ°μ°μλ μ¬μ©νμ§ λ§μλ°μ±λ κΈ°λ³Έ νμ ν΄λμ€κ° μ 곡νλ μ μ
compareλ©μλλCompartorμΈν°νμ΄μ€κ° μ 곡νλ λΉκ΅μ μμ± λ©μλλ₯Ό μ¬μ©νμ.
Last updated
Was this helpful?