티스토리 뷰

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);
    }
    
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함