가끔 마주할 때마다 매번 헷갈리는 정렬..
백준 문제 풀며 정리해보았다.
첫번째 기준은 x가 작은순으로, 같다면 y가 작은 순.
오름차순이란 말.
직접 클래스에서 @Override 하지 않고 쓰는 방법들이 있다.
그 중 두가지.
List 인터페이스에 작성된 메서드인 sort().
괄호 안에 Comparator를 구현하면 된다.
class Point {
int x;
int y;
}
...
arr.sort((o1, o2) -> {
if(o1.x != o2.x) return o1.x - o2.x;
return o1.y - o2.y;
});
sort() 메서드 안에서 compare를 재정의 해주면 된다.
혹은,
arr.sort((o1, o2) -> {
if(o1.x != o2.x) return Integer.compare(o1.x, o2.x);
return Integer.compare(o1.y, o2.y);
});
자료형이 Integer 이므로 그냥 이렇게 비교해줘도 된다.
class Point {
int x;
int y;
int getX() {
return this.x;
}
int getY() {
return this.y;
}
}
...
arr.sort(Comparator.comparing(Point::getX)
.thenComparing(Point::getY));
Comparator.comparing
으로 원하는 필드의 getter 를 넣어준다..thenComparing
을 이용Arrays.sort(arr, (o1,o2) -> {
if(o1.x == o2.x) {
return Integer.compare(o1.y, o2.y);
}
else {
return Integer.compare(o1.x, o2.x);
}
});
물론 배열을 써도 된다. 배열을 쓸 때에는 Arrays.sort(Object[] o, 구현)
형태이다.
단어의 길이순 정렬. 같을 때는 사전순으로.
문자열 String 을 정렬하는 문제다.
arr.sort((o1, o2) -> {
if(o1.length() != o2.length()) return o1.length() - o2.length();
return o1.compareTo(o2);
});
위의 형식이 익숙해지면 쉽게 풀 수 있는 문제다.
원하는 정렬 기준을 스코프 안에 정의해주면 된다.
이번엔 String이 구현해놓은 compareTo 메서드를 활용해서 풀어줬다.
easy..
제발 헷갈리지 말자.~
이미 정렬 기준이 있을 땐(오버라이딩을 미리 했거나 디폴트 정렬할 땐)
Collections.sort() 를 통해 정렬하면 된다.
Collections.sort(List<T> list);
이정도면 정렬은 어느정도 익혔고,, 여전히 헷갈리는 오름차순, 내림차순 기준을 정해서 리턴할 때,
음수 양수에 관해서 다시 살펴보자.
음수를 리턴하면 오름차순인건 알겠는데 왜 그런지를 로직 이해를 전혀 못하고 있는 나다.
(작성중 .. )