1. Interface Comparable
정의 : 기본적으로 정렬하는 기준이 되는 메소드를 정의하는 인터페이스
사용 : 쉽게 말해 Arrays.sort() 메서드는 아래와 같은 정렬 기준인데, 기준을 반대로 역정렬 하고싶을때 등등 사용
=> 기본정렬기준 자체를 변경하여 사용하고 싶을때
ex). Integer,Double등 => 오름차순 정렬
String => 사전순 정렬
compareTo()메소드를 사용해서 정렬하는데,
현재객체 < 파라미터 => return 음수
현재객체 == 파라미터 => return 0
현재객체 > 파라미터 => return 양수
양수인 경우에는 두 객체의 자리가 바뀌고, 음수 또는 0이면 객체의 자리가 그대로 유지된다.
사용방법 : 기존 sort()메소드를 재정의 했기때문에 그대로 사용한다.
- 1). Arrays.sort(array);
- 2). Collections.sort(list);
예시 : x,y좌표 List를 받아 , x좌표가 증가하는 순으로 정렬하는데, x좌표값이 같다면 y가 증가하는 순으로 정렬하시오.
public class MyComparable implements Comparable<MyComparable>{
int x,y;
@Override
public int compareTo(MyComparable p) {
// Comparable의 메소드를 오버라이드 한다.
if(this.x > p.x) {
return 1;
}else if(this.x == p.x) {
if(this.y>p.y) {
return 1;
}
}
return -1;
}
@Override
public String toString() {
return "Point [x=" + x + ", y=" + y + "]";
}
public MyComparable(int x, int y) {
this.x = x;
this.y = y;
}
public static void main(String[] args) {
List<MyComparable> pointList = new ArrayList<>();
pointList.add(new MyComparable(1,10));
pointList.add(new MyComparable(6,5));
pointList.add(new MyComparable(6,3));
pointList.add(new MyComparable(2,6));
pointList.add(new MyComparable(1,4));
Collections.sort(pointList);
pointList.forEach((MyComparable p)->System.out.println(p.toString()));
}
결과 :
MyComparable [x=1, y=4]
MyComparable [x=1, y=10]
MyComparable [x=2, y=6]
MyComparable [x=6, y=3]
MyComparable [x=6, y=5]
2. Interface Comparator
정의 : 정렬가능한 클래스(Comparable Interface를 구현한)의 정렬 기준과 다르게 변경하여 사용하고 싶을때
사용 : 오름차순 정렬을 내림차순으로 바꿔서 사용하고싶을때 등 => 기본 정렬기준과 다르게 정렬하고싶을때 => 만들
어서 사용하고 싶을때
compare()메소드를 사용해서 정렬하는데,
첫 파라미터 < 둘째 파라미터 => return 음수
첫 파라미터 == 둘째 파라미터 => return 0
첫 파라미터 > 둘째 파라미터 => return 양수
양수인 경우에는 두 객체의 자리가 바뀌고, 음수 또는 0이면 객체의 자리가 그대로 유지된다.
==>Integer.compare(x, y)(오름차순 정렬)와 동일한 개념
=>return (x<y)? -1: ((x==y)? 0:1);
=> 내림차순은 x와 y를 거꾸로 넣으면 된다.
사용방법 : sort()메소드를 사용할떄 내가 재정의한 Comparator를 같이 입력해준다.
-1). Arrays.sort(array,myComparator);
-2). Collections.sort(list,,myComparator);
예시 : x,y좌표 List를 받아 x좌표가 증가하는 순으로 정렬하는데, x좌표값이 같다면 y가 감소하는 순으로 정렬하시오.
public class MyComparator implements Comparator<MyComparable>{
int x, y;
@Override
public int compare(MyComparable o1, MyComparable o2) {
if(o1.x > o2.x) {
return 1;
}else if(o1.x == o2.x) { //x가 같다면 y가 큰 순서대로 정렬
if(o1.y < o2.y) {
return 1;
}
}
return -1;
}
public static void main(String[] args) {
List<MyComparable> comList = new ArrayList<>();
comList.add(new MyComparable(1,2));
comList.add(new MyComparable(2,6));
comList.add(new MyComparable(1,1));
comList.add(new MyComparable(5,3));
MyComparator myComparator = new MyComparator();
Collections.sort(comList,myComparator);
comList.forEach((MyComparable c) -> System.out.println(c.toString()));
}
}
결과 :
MyComparable [x=1, y=2]
MyComparable [x=1, y=1]
MyComparable [x=2, y=6]
MyComparable [x=5, y=3]
Comparator는 아주 편리하게 Coparator 인스턴스 생성과 동시에 오버라이드해서 사용하는것이 가능하기때문에, 특정 규칙을 사용하는 부분이라면 바로 사용하는게 낫다.
public static void main(String[] args) {
List<MyComparable> comList = new ArrayList<>();
comList.add(new MyComparable(1,2));
comList.add(new MyComparable(2,6));
comList.add(new MyComparable(1,1));
comList.add(new MyComparable(5,3));
Collections.sort(comList,new Comparator<MyComparable>() {
@Override
public int compare(MyComparable o1, MyComparable o2) {
if(o1.x>o2.x) {
return 1;
}else if(o1.x== o2.x) {
if(o1.y > o2.y) {
return 1;
}
}
return -1;
}
});
comList.forEach((MyComparable c) -> System.out.println(c.toString()));
}
예시2 : Array를 사전 역순으로 정렬하시오
public class MyComparatorArray implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
char[] a1 = o1.toCharArray();
char[] a2 = o2.toCharArray();
//한글자이기 때문에 0으로 하드입력.
if(a1[0]>a2[0]) {
return 1;
}else if(a1[0]==a2[0] ){
return 0;
}
return -1;
}
public static void main(String[] args) {
String[] arr = new String[] {"A","C","B","D","A"};
Arrays.sort(arr,new MyComparatorArray());
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
우선순위 Queue의 2번째 인자로 comparator를 사용해서 우선순위를 할당할수 있다고 하는데, 알아두면 좋겠다!
오늘도 화이팅!
'Java > Basic' 카테고리의 다른 글
[Java-Basic] Java 언어의 특징 및 OOP의 특징 (0) | 2021.07.14 |
---|---|
[Java-Basic] 함수형 인터페이스 (Functional Interface) 예제 (0) | 2021.05.31 |
[Java-Basic] List<Obj> 특정값 기준 중복제거 방법 (0) | 2021.05.26 |
[Java-Basic] Java 정규표현식 (0) | 2021.05.24 |
[Java-Basic] JVM 메모리구조 및 개념 (0) | 2021.05.21 |