티스토리 뷰
compareTo
두 값을 비교하여 int 값으로 반환해주는 함수로 문자열이나 숫자끼리 비교할 수 있다.
int compareTo(NumberSubClass referenceName)
int compareTo(String anotherString)
숫자
(기준 값 - 비교대상 값)을 반환한다고 생각하면 쉽다.
기준이 비교대상보다 크면 1, 작으면 -1, 동일하면 0을 반환한다.
public class Main{
public static void main(String[] args){
Integer x = 3;
Integer y = 4;
Double z = 1.0;
System.out.println(x.compareTo(y)); // -1
System.out.println(x.compareTo(2)); // 1
System.out.println(x.compareTo(3)); // 0
System.out.println(z.compareTo(2.3) // -1
}
}
문자
compareTo는 같은 위치의 문자끼리 비교한다.
public class Main
{
public static void main(String[] args) {
String str = "apple";
// 비교대상에 일치하는 문자열이 포함되어 있는 경우
System.out.println(str.compareTo("apple")); // 0 (기준문자열 길이) - (비교대상 길이)
System.out.println(str.compareTo("ap")); // 3
System.out.println(str.compareTo("applepie")); // -3
// 전혀 다른 문자열
System.out.println(str.compareTo("abc")); // 14 (p,b 아스키코드 값 차이)
System.out.println(str.compareTo("p")); // -15 (a,p 아스키코드 값 차이)
System.out.println(str.compareTo("park")); // -15 (a,p 아스키코드 값 차이)
System.out.println(str.compareTo("hello")); // -7 (a,h 아스키코드 값 차이)
}
}
Comparable 인터페이스 활용 - compareTo 오버라이딩
Comparable 인터페이스는 컬랙션의 정렬 조건을 객체 내부에 정의할 수 있게 해준다.
객체의 compareTo() 함수를 오버라이딩하여 정렬 조건을 원하는대로 재정의할 수 있다.
다음은 Person객체의 age 값을 기준으로 내림차순 정렬한 코드다.
compareTo 함수에서 리턴 값이 양수면, 두 값의 자리가 교체된다.
자리가 교체된다는 것은, 기준값보다 앞으로 이동한다는 의미로 받아들이면 될 것 같다.
즉, 정렬을 위한 자리 교체가 발생하는 조건을 compareTo 함수에 구현할 때
내림차순 정렬은 비교대상 - 기준값(비교대상>기준값일 때 교체)을,
오름차순 정렬은 기준 - 비교대상값(비교대상<기준값일 때 교체)을 반환한다.
자세한 내용은 코드를 참고하면 될 것 같다.
import java.util.*;
class Person implements Comparable<Person> {
public String name;
public int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
// 나이기준 내림차순 정렬
// 리턴 값이 양수면, 두 값의 자리가 변경된다.
if (age < o.age) { return 1; } // return o.age - age;
else { return -1; }
}
}
public class Main {
public static void main(String[] args){
ArrayList<Person> ps = new ArrayList<Person>();
ps.add(new Person("김",20));
ps.add(new Person("박",25));
ps.add(new Person("최",18));
Collections.sort(ps);
for (Person p : ps) {
System.out.println("나이 : " + p.age + " | 이름 : " + p.name);
}
}
}