정렬과 관련된 interface는 Comparable, Comparator 이렇게 두 가지가 있다.
Comparable
- Collection에 추가되는 데이터 자체의 정렬 기준을 넣고 싶을 때 구현하는 인터페이스이다. (내부 정렬기준 구현하기)
- Comparable에서는 compareTo()메서드를 재정의해야한다.
- String클래스, Wrapper 클래스, Date클래스, File 클래스에는 내부 정렬 기준이 구현되어 있다.
(내부 정렬 기준은 오름차순으로 처리되도록 구현되어 있다.)
int 타입 비교할때는 A.compareToB; 쓰면안됨. 이건 String비교,,
ex. return Integer.compare(this.getNum(),o.getNum());
내부 정렬 기준 추가하기: Comparable 인터페이스를 구현한다.
getter, setter 잘 만들어줘야 골치 안아픔 ㅠ
예제) Member 클래스의 회원이름을 기준으로 오름차순 정렬이 되도록하는 내부정렬
class Member implements Comparable<Member>{ //회원관리 클래스
private int num; //회원번호
private String name;
private String tel;
// alt+shift+s 누르면 생성자 자동생성
public Member(int num, String name, String tel) {
super();
this.num = num;
this.name = name;
this.tel = tel;
}
public int getNum() {
return num;
}
public String getName() {
return name;
}
public String getTel() {
return tel;
}
@Override
public String toString() {
return "Member [num=" + num + ", name=" + name + ", tel=" + tel + "]";
}
// 내부 정렬 기준을 설정하는 메서드 구현하기
// (회원 이름의 오름차순 기준 설정)
@Override
public int compareTo(Member mem) {
// TODO Auto-generated method stub
return this.getName().compareTo(mem.getName());
}
}
Comparator
- 외부에 별도로 정렬 기준을 구현하고 싶을 때 사용하는 인터페이스이다.(외부정렬 기준 구현하기)
- Comparator에서는 compare()메서드를 재정의해야한다.
compare메서드의 반환값
- 반환값이 0 : 두 값이 같다.
- 반환값이 양수: 두 값의 순서를 바꾼다.
- 반환값이 음수: 두 값의 순서를 바꾸지 않는다.
예) 오름차순일 경우: 앞의 값이 크면 양수, 같으면 0 / 뒤의 값이 크면 음수가 반환되도록 구현한다.
Collection Sort
정렬은 Collections.sort() 메서드를 이용하여 정렬한다.
Collections.sort(list);
정렬 방식을 정해주는 class만들기
(외부 정렬 기준 class만들기)
class Desc implements Comparator<String>{
@Override
public int compare(String str1, String str2) {
//내림차순으로 구현하려고 한다.
/* if(str1.compareTo(str2)>0){
return -1;
}else if(str1.compareTo(str2)<0){
return 1;
}else{
return 0;
}
*/
return str1.compareTo(str2) * -1;
}
}
compareTo
문자열을 비교하여 그에 해당하는 int값을 반환한다.
A=A일경우 0을반환
A>B일 경우 1을반환 (좌측값이 큰경우)
A<B일 경우 -1을반환(좌측값이 작은경우)
즉 compareTo의 기본값은 오름차순임을 알 수 있음
String str1 = "AA";
String str2 = "AA";
String str3 = "BB";
System.out.println(str1.compareTo(str2)); //결과는0
System.out.println(str2.compareTo(str3)); //결과는-1
System.out.println(str3.compareTo(str2)); //결과는1
예제) 내림차순 구현
@Override
public int compare(String str1, String str2) {
//내림차순으로 구현하려고 한다.
/* if(str1.compareTo(str2)>0){
return -1;
}else if(str1.compareTo(str2)<0){
return 1;
}else{
return 0;
}
*/
return str1.compareTo(str2) * -1;
}