Java 정렬과 Lamda 사용의 정렬
JDK 7
JDK 7 까지는
Collections.sort() - List 정렬
Arrays.sort() - Primitive Type(int, double, float ..)의 배열을 정렬
Collections.sort
https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html
Arrays.sort
import java.util.Arrays;
import java.util.Collections;
public class PrimitiveExam {
public static void main(String[] args) {
int[] numbers = new int[] {1,3,6,7,8,9,0};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));
// 역순
Integer[] numbersInt = new Integer[numbers.length];
for(int i=0; i<numbers.length; i++) {
numbersInt[i] = numbers[i];
}
Arrays.sort(numbersInt, Collections.reverseOrder());
System.out.println(Arrays.toString(numbersInt));
}
}
[0, 1, 3, 6, 7, 8, 9]
[9, 8, 7, 6, 3, 1, 0]
Primitive 타입의 배열을 역순으로 정렬하려면 안됩니다.
Wrapper 타입의 자료형만이 역순 정렬을 할 수 있습니다.
Primitiver 자료형을 Wrapper 클래스로 바꾸는 거를 박싱(Boxing)이라고 한다. 반대는 언박싱
그 이유는 Arrays.sort() 메소드의 두 번째 파라미터가 제네릭 클래스로 어떠한 객체를 받는데 int인 Primitive type은 객체가 아니기 때문이다.
그럼 객체의 정렬을 알아보자
객체의 정렬
객체의 클래스가 Comparable 을 구현해서 compareTo() 메소드를 구현하여 비교 기준을 정해주면 된다.
익명함수를 이요하여 Comparator 로 비교 기준 전달하면 된다.
Comparable - compareTo()
Comparable은 인터페이스로 compareTo()를 재정의하여 한다는 것이다.
매개변수가 하나이므로 자기 자신과 매개변수 객체를 비교
https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html#method.summary
Comparator - compare()
comparator도 인터페이스므로 compare()를 구현하여 사용하면 된다.
매개변수가 두 개이므로 두 매개변수 객체를 비교
https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#method.summary
두 메소드 모두 T 객체 타입을 받아 비교를 한다는 공통점이 있다.
그리고
compareTo()와 compare() 는 int 값을 반환하도록 되어 있다.
값을 비교해서 정수를 반환하고 0, 양수, 음수를 반환한다.
상대방과의 대소관계에 대한 값을 표현한는 것이다.
예를 들어 3를 기준으로 1, 3, 6의 숫자를 비교 하였을 때
3 - 1 의 경우 +2 의 차이이므로 양수
3 - 3 의 경우 0 의 차이이므로 0
3 - 6 의 경우 -3 의 차이이므로 음수로 표현하게 된다.
JDK 8
JDK 8 부터는 람다 문법을 지원한다.
그리고 default method 라는 것이 등장하여 인터페이스에서 default를 붙여 메소드를 구현 가능하다.
Collections.sort() 형식으로 호출할 필요 없이 리스트에서 바로 메소드 호출이 가능하다.
default void sort(Comparator<? super E> c){
Collections.sort(this,c);
}
Lambd 람다
람다는 함수형 인터페이스 에만 쓰일 수 있습니다.
함수형 인터페이스란 오직 하나의 추상 메소드만 가지는 인터페이스를 말한다.
그래서 람다는 타입 추론이 가능하다.
인터페이스의 유일한 추상 메소드를 보고 타입을 추론할 수 있기 대문에 람다표현식에 타입을 명시해주지 않아도 된다.
2가지의 문법
numbers.sort((Integer num1, Integer num2) -> { return num1-num2;}
// 타입 추론 후
(parameters) -> expression
numbers.sort((num1, num2) -> num1-num2);
or
(parameters) -> {statements;}
numbers.sort((num1, num2) -> Integer.compare(num1, num2));
메소드 참조
메소드의 정의를 제공해서 람다와 동일한 기능 수행
메소드 이름 앞에 :: 구분자를 붙여서 메소드 참조가 가능하다.
numbers.sort(Integer::compare)
참고
https://velog.io/@g00dluckroon/Java%EC%97%90%EC%84%9C-%EC%A0%95%EB%A0%AC%EA%B3%BC-lambda
https://st-lab.tistory.com/243
https://countryxide.tistory.com/127
'코테 > 개념 정리' 카테고리의 다른 글
DFS( Depth first Search) - 깊이 우선 탐색 (1) | 2023.12.27 |
---|---|
BFS (Breadth First Search ) - 너비 우선 탐색 (0) | 2023.12.27 |
java.uti.StringTokenizer 클래스 란? (0) | 2023.12.23 |
[ Heap ] 힙이란? 우선순위 큐란? (0) | 2023.12.23 |
리스트 ArrayList <-> 배열 Array 변환 (1) | 2023.12.18 |