[Java] Comparable 과 Comparator

2024. 7. 2.·Java
반응형

Comparable 과 Comparator

Comparable 과 Comparator 는 모두 객체를 비교하기 위한 인터페이스

Comparable 에는 compareTo(T o)(자기 자신과 매개변수 객체를 비교)

Comparator 에는 compare(T o1, T o2)(두 매개변수 객체를 비교) 메소드가 선언되어 있다

두 인터페이스 모두 제네릭 타입에 대해서만 사용이 가능하다.


자바에서의 비교는 기본적으로 오름차순이다
즉 두 원소의 비교결과가 음수일 경우 교환을 진행하지 않는다.
오름차순일 경우 선행원소 - 후행원소
내림차순일 경우 후행원소 - 선행원소


Comparable

예시

public class People implements Comparable<People>{
// 매개변수들
int age;
public People(int age) {
this.age = age;
}
@Override
public int compareTo(People p){
// 비교구현 ( 들어온 파라미터 p 에 대해 age 로 정렬)
return this.age - p.age;
}
}

새로 만든 객체 자기자신과 매개변수 객체를 비교한다.
return 값이 양수일 경우 자기 자신이 더 큼

 

사용방법1. 객체의 비교

People a = new People(1);
People b = new People(2);
a.compareTo(b) // 1 양수가 나옴

사용방법2. 배열 & List 로써의 비교

ArrayList<People> p = new ArrayList<>();
p.add(new People(1));
p.add(new People(3));
p.add(new People(2));
Collections.sort(p);
People[] pp = new People[3];
pp[0] = new People(1);
pp[1] = new People(3);
pp[2] = new People(2);
Arrays.sort(pp);

위처럼 Comparable 를 구현해 두면, 구현해 둔 내용으로 메소드를 이용해 정렬이 가능하다.


위처럼 단순하게 - 연산을 하는 경우 int 값의 오버플로우가 발생할 수 있기에
비교연산자를 통해 대소비교 후 음,양수 값을 뱉는게 안전하다.

String 에서의 compareTo

String 클래스에서도 compareTo 메소드가 있으며, 이또한 Comparable 을 구현한 것이다.
이는 문자열의 사전식 정렬 비교를 도와주거나 크기를 비교해준다.


Comparator

Comparable 과 달리 매개변수로 두개의 원소를 받고

이 두 원소는 자기자신과 상관이 없다. 자기 자신은 두 객체 비교에 영향이 없다

Comparable 과 같이 사용할경우 쓸모없는 객체 가 추가된다.

비교만을 위해서 사용하는게 효율적이므로 익명 객체(클래스) 를 사용한다.

익명객체 구현 1

public class Main{
public static void main(String[] args) {
// 익명객체 구현 (나이비교용)
Comparator<People> ageComp = new Comparator<People>() {
@Override
public int compare(People o1, People o2) {
return o1.age - o2.age;
}
};
// 익명객체 구현 (키 비교용)
// 익명객체 구현
Comparator<People> heightComp = new Comparator<People>() {
@Override
public int compare(People o1, People o2) {
return o1.height - o2.height;
}
};
People p1 = new People(17, 180);
People p2 = new People(21, 170);
ageComp.compare(p1, p2); // -4
heightComp.compare(p1, p2); // 10
}
}
class People {
int age;
int height;
public People(int age, int height) { this.age = age; this.height = height;}
}

 

이를 통해 compare 로 두 객체를 비교할 수 있게 되고,

여러가지 비교를 구현하고자 할때 원하는 만큼만 익명객체를 만들어 비교가 가능함

 

익명객체 구현2 (배열)

Arrays.sort(arr, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
return s1.length() - s2.length();
}
})
Collections.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});

List , 배열의 sort 정렬시 두번째 매개변수로 Comparator 익명함수를 사용해

원하는 방식으로 정렬을 진행할 수 있다.

관련문제

[10814] 나이순 정렬

 

 

참고출처

반응형
저작자표시 (새창열림)

'Java' 카테고리의 다른 글

BufferWriter & Reader  (0) 2023.01.12
(예정예정)A a = new B();  (0) 2023.01.12
자바 변수 종류 - 인스턴스/클래스/전역/지역 변수  (0) 2023.01.05
클래스,객체,인스턴스  (0) 2023.01.05
배열 array  (0) 2022.10.27
'Java' 카테고리의 다른 글
  • BufferWriter & Reader
  • (예정예정)A a = new B();
  • 자바 변수 종류 - 인스턴스/클래스/전역/지역 변수
  • 클래스,객체,인스턴스
keartt
keartt
shalpha_2@naver.com
주니어 탈출일기 🐽
shalpha_2@naver.com
  • keartt
전체
오늘
어제
  • 전체보기
    • CS & 알고리즘
      • CS (컴과학)
      • 알고리즘
      • 백준
    • Spring
      • SpringBoot (JPA)
      • Spring (Legacy)
    • Server
      • Linux
      • Docker
    • Java
      • Design Pattern
    • PostgreSQL
    • GIS (공간정보)
    • 오류정리
    • Git
    • JavaScript
      • Node.js
      • React
    • Tool
      • IntelliJ
      • MacOS
      • VSCode
      • Eclipse
      • Other
    • 강의정리들
      • [2023] FullStack
      • [2022] Spring Boot
      • [2021] Spring Boot

인기 글

태그

브루트포스
이분탐색
코딩애플
구간합
반응형
hELLO· Designed By정상우.v4.6.1
keartt
[Java] Comparable 과 Comparator

개인정보

kearttshalpha_2@naver.com계정관리

운영중인 블로그

주니어 탈출일기쓰기블로그 관리

이동링크목록

  • 티스토리 홈
  • 피드
  • 로그아웃
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.