Comparator 인터페이스
객체의 대소 관계를 판단할 때 주로 사용한다.
- 첫 번째 인수가 더 크면 양수
- 첫 번째 인수가 더 작으면 음수
- 첫 번째와 두 번째 인수가 같으면 0을 반환한다.
//java.util.Comparator의 정의
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
java.util 패키지는 java에서 제공하고 있는 패키지 중 하나다.
//class내부에서 COMPARATOR를 정의
import java.util.Comparator;
class X {
public static final Comparator<T> COMPARATOR = new Comp();
private static class Comp implements Comparator<T> {
//메서드 구현
public int compare(T d1, T d2) {
//d1>d2 ->양수, d1 < d2 ->음수, 같으면 0
}
}
}
package algo;
import java.util.*;
public class uyf {
static class PhyscData {
private String name;
private int height;
private double vision;
public PhyscData(String name, int height, double vision) {
this.name = name;
this.height = height;
this.vision = vision;
}
public static final Comparator<PhyscData> HEIGHT_ORDER = new HeightOrderComparator();
private static class HeightOrderComparator implements Comparator<PhyscData> {
public int compare(PhyscData d1, PhyscData d2) {
return (d1.height > d2.height) ? 1 :
(d1.height < d2.height) ? -1 : 0;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
PhyscData[] x = {
new PhyscData("hee", 159, 0.8),
new PhyscData("hee2", 169, 1.5),
new PhyscData("hee3", 179, 0.7),
new PhyscData("hee4", 189, 0.8)
};
System.out.print("키가 몇인 사람을 찾음?: ");
int height = sc.nextInt();
int idx = Arrays.binarySearch(x, new PhyscData("", height, 0.0), PhyscData.HEIGHT_ORDER);
if (idx < 0)
System.out.println("no exist");
else {
System.out.println(x[idx]);
}
}
}
cf : package java.util;
public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c) {
return binarySearch0(a, 0, a.length, key, c);
}
바로 위의 코드는 java.util이란 package안에 있는 binarySearch라는 함수이고, 세번째 파라미터로 Comparator인터페이스에 대한 객체가 들어갈 수 있습니다.
위의 uyf클래스 안 main함수에 있는 변수 idx에 초기값을 설정할 때, binarySearch함수를 이용해 인덱스를 부여하게 됩니다.
compare함수를 쓰기 위해서는, Comparator인터페이스 안에 있는 compare 함수를 구체화 해주어야 합니다.
따라서, uyf의 내부클래스 HeightOrderComparator는 Comparator를 구현해주었습니다.
이렇게 binarySearch의 세번째 인자에, PhyscData.HEIGHT_ORDER을 넣음으로써, 직접 코드에서 구체화한 compare함수를 쓸 수 있게됩니다.
int idx = Arrays.binarySearch(x, new PhyscData("", height, 0.0), PhyscData.HEIGHT_ORDER);
요약하자면, idx에 초기값이 할당 될때, binarySearch함수가 내부적으로 compare함수를 실행합니다.
추가로, binarySearch는 [이진탐색]으로 찾고 싶은 항목을 정렬이 된 상태에서 찾을 수 있습니다.
(정렬이 되지 않아있는 상태에서는 잘못된 값을 반환할 수 있습니다)
Generics
처리 대상의 자료형에 의존하지 않도록 클래스나 인터페이스를 구현하는 기능
-> 자료형 문제로부터 자유롭고 안전하다
- 대문자 1개를 사용한다.
- collection내부 요소의 자료형은 elements의 머리글자인 E를 사용한다. (collection : 자바에서 제공하는 기본 자료구조를 모은 것)
- Map 내의 Key, value의 자료형은 각각 K, V를 사용한다.
- 일반적인 자료형은 T를 사용한다. (왜냐하면 <Type>에서 따온거)
와일드카드
- <? extends T> : 클래스 T의 하위 클래스를 전달받는다.
- <? super T> : 클래서 T의 상위 클래스를 전달받는다.
class GenericPractice {
static class GenericClass<T> {
private T xyz;
GenericClass(T t) {
this.xyz = t;
}
T getXyz() {
return xyz;
}
}
public static void main(String[] args) {
//이렇게 매개변수에 원하는 자료형을 넣을 수 있음
GenericClass<Stirng> s = new GenericClass<String>("ABC");
GenericClass<Integer> s = new GenericClass<Integer>(15);
}
728x90
'자료구조당' 카테고리의 다른 글
자료구조와 알고리즘 (0) | 2023.11.14 |
---|---|
Do it! 자료구조와 함께 배우는 알고리즘 입문 - 자바편 (p.169 연습문제) (0) | 2023.06.17 |
doit (0) | 2023.05.13 |
Do it! 자료구조와 함께 배우는 알고리즘 입문 - 자바 편 (p.111~115) [ 검색 알고리즘 ] (0) | 2023.05.11 |
Do it! 자료구조와 함께 배우는 알고리즘 입문 - 자바 편 (p.~110) [ 검색 알고리즘 ] (0) | 2023.05.10 |