NMP-Study / EffectiveJava2022

Effective Java Study 2022
5 stars 0 forks source link

아이템 14. Comparable을 구현할지 고려하라 #14

Closed okhee closed 2 years ago

mbyul commented 2 years ago

compareTo

compareTo 메서드의 일반 규약

1. 대칭성 : sng(x.compareTo(y)) == -sgn(y.compareTo(x))

2. 반사성 : if x.compareTo(y) == 0 then sng(x.compareTo(z)) == sng(y.compareTo(z))

3. 추이성 : if x.compareTo(y) > 0 && y.compareTo(z) then x.compareTo(z) > 0

4. 동치성 : (x.compareTo(y) == 0) == (x.equals(y))

compareTo 메서드 작성

기본 타입 필드가 여럿일 때의 비교자

public class PhoneNumber implements Comparable<PhoneNumber> {
    private short areaCode;
    private short prefix;
    private short lineNum;

    PhoneNumber(short areaCode, short prefix, short lineNum) {
        this.areaCode = areaCode;
        this.prefix = prefix;
        this.lineNum = lineNum;
    }

    public int compareTo(PhoneNumber phoneNumber) {
        int result = Short.compare(areaCode, phoneNumber.areaCode);

        if (result == 0) {
            result = Short.compare(prefix, phoneNumber.prefix);

            if (result == 0) {
                result = Short.compare(lineNum, phoneNumber.lineNum);
            }
        }

        return result;
    }

    public static void main(String[] args) {
        PhoneNumber phoneNumber1 = new PhoneNumber((short)31, (short)784, (short)4324);
        PhoneNumber phoneNumber2 = new PhoneNumber((short)31, (short)784, (short)4324);
        PhoneNumber phoneNumber3 = new PhoneNumber((short)31, (short)784, (short)1000);

        System.out.println("PhoneNumber.main :" + phoneNumber1.compareTo(phoneNumber2));
        System.out.println("PhoneNumber.main :" + phoneNumber1.compareTo(phoneNumber3));
    }
}

Process finished with exit code 0


#### 비교자 생성 메서드를 활용한 비교자
~~~ java
import java.util.Comparator;

import static java.util.Comparator.comparingInt;

public class PhoneNumber2 implements Comparable<PhoneNumber2>  {
    private static final Comparator<PhoneNumber2> COMPARATOR = comparingInt((PhoneNumber2 pn2) -> pn2.areaCode).thenComparingInt(pn2 -> pn2.prefix).thenComparingInt(pn2 -> pn2.lineNum);

    private short areaCode;
    private short prefix;
    private short lineNum;

    PhoneNumber2(short areaCode, short prefix, short lineNum) {
        this.areaCode = areaCode;
        this.prefix = prefix;
        this.lineNum = lineNum;
    }

    @Override
    public int compareTo(PhoneNumber2 phoneNumber2) {
        return COMPARATOR.compare(this, phoneNumber2);
    }

    public static void main(String[] args) {
        PhoneNumber2 phoneNumber1 = new PhoneNumber2((short)31, (short)784, (short)4324);
        PhoneNumber2 phoneNumber2 = new PhoneNumber2((short)31, (short)784, (short)4324);
        PhoneNumber2 phoneNumber3 = new PhoneNumber2((short)31, (short)784, (short)1000);

        System.out.println("PhoneNumber2.main :" + phoneNumber1.compareTo(phoneNumber2));
        System.out.println("PhoneNumber2.main :" + phoneNumber1.compareTo(phoneNumber3));
    }

}
PhoneNumber.main :0
PhoneNumber.main :1

Process finished with exit code 0

Comparator의 보조 생성 메서드 종류

2018-12-06 11 23 49
mbyul commented 2 years ago

comparingInt 등 사용 시 nullsFirst 사용해서 해야 Exception 뱉지 않음

mbyul commented 2 years ago

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/CompareToBuilder.html

apache common lang3 에 CompareToBuilder도 있음!