Comparator
구글링을 해봤을 때
임의의 길이와 표준자를 비교하면서
극히 정확하게 길이를 잴 수 있는 기구
라고 한다.
전자공학에서는 비교기, 비교측정기 라고한다.
Comparator는 자바의 인터페이스이다.
인터페이스로부터 Comparator객체를 구현하여
사용한다.
수정자 및 타입 | 메서드 설명 |
int | int compare(T o1, T o2) 두 인수를 순서에 대하여 비교한다. o1 < o2 일 때 : 음의 정수 o1 = o2 일 때 : 0 o1 > o2 일 때 : 양의 정수 구현하는 사람은 반드시 모든 x와 y에 대하여 sgn(compare(x, y)) == -sgn(compare(y, x))이 보장해야 한다. ex) x = 11, y = 12 sgn(compare(x와 y의 비교)) : -1 sgn(compare(y와 x의 비교)) : 1 1 == -(-1) 1 == 1 (11과 12의 관계는 보장된다.) 구현하는 사람은 또한 x, y의 관계와 y, z의 관계를 가지고 x, z의 관계를 알 수 있도록 보장해야한다 : ((compare(x, y) > 0 && (compare(y, z)>0)) 는 compare(x, z)>0 을 의미 ex) x>y, y>z 의 관계일 때 => x>y>z의 관계가 되므로 x와 z의 관계가 x>z가 될 수 있음을 알 수 있다. 마지막으로 구현자는 모든 z에 대하여, compare(x, y) == 0이 sgn(compare(x, z)) == sgn(compare(y, z)) 임을 보장해야한다. ex) x = 17, y = 17, z = 19 sgn(compare(x와 y의 비교)) : 0 sgn(compare(x와 z의 비교)) : 1 sgn(compare(y와 z의 비교)) : 1 따라서 x<z, y<z의 관계는 보장되었다. 설명을 위해 sgn함수를 사용하고있다. sgn함수는 -1, 0, 1 을 반환하므로 2가 아니다. 하지만 실제 메서드에서는 x와 z의 관계에 대하여 2를 반환할 것이다. (헷갈리지 않았으면 한다.) 일반적으로 (compare(x, y) == 0) == (x.equals(y))으로 엄격하게 요구되는 것은 아니다. ⭐sgn(sign(um) function) 는 특수함수중 하나로, 어떤 실수의 부호를 출력하는 함수이다. 이 함수에서는 음수, 0, 양수인지에 따라 -1, 0, 1 중 하나를 반환하도록 정의된다. 참고 - 나무위키 - Parameters : o1 - 비교할 첫 번째 object o2 - 비교할 두 번째 object Returns : o1 < o2 일 때 : 음의 정수 o1 = o2 일 때 : 0 o1 > o2 일 때 : 양의 정수 Throws : ClassCastException : 인수 유형으로 인해 이 comparator와 비교할 수 없는 경우 NullPointerException : 인수가 null이고 이 comparator에서 null 인수를 허용하지 않는 경우 |
Comparator (Java Platform SE 8 )
Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. In the foregoing description, the notation sgn(expression) designates the mathematical s
docs.oracle.com
Comparator doc에는
매서드의 개수가 10개가 넘는다.
정말 엄청나게 많은데
그중에 대표적인
compare(T o1, T o2)를 중점적으로
다뤄보았다.
Comparator객체를 생성하여 문자열 정렬
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
String[] arr = {"사아자", "가나다", "라마바", "타파하", "차카아"};
Arrays.sort(arr, new StringComparator());
System.out.println(Arrays.toString(arr));
}
}
//문자열 오름차순 Comparator
class StringComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
System.out.println("s1 : " + s1 + " s2 : " + s2);
System.out.println("s1.compareTo(s2) : " + s1.compareTo(s2));
return s1.compareTo(s2);
}
}
--------------------------------------------------------------------------
s1 : 가나다 s2 : 사아자
s1.compareTo(s2) : -5292
s1 : 라마바 s2 : 가나다
s1.compareTo(s2) : 2940
s1 : 라마바 s2 : 사아자
s1.compareTo(s2) : -2352
s1 : 라마바 s2 : 가나다
s1.compareTo(s2) : 2940
s1 : 타파하 s2 : 라마바
s1.compareTo(s2) : 6468
s1 : 타파하 s2 : 사아자
s1.compareTo(s2) : 4116
s1 : 차카아 s2 : 사아자
s1.compareTo(s2) : 2940
s1 : 차카아 s2 : 타파하
s1.compareTo(s2) : -1176
[가나다, 라마바, 사아자, 차카아, 타파하]
Process finished with exit code 0
Arrays.sort()에
StringComparator 객체를 생성한 후
오름차순으로 정렬하였다.
출력을 확인해 보면
문자열끼리의 덧셈과 뺄셈이 이루어지기 위해
특별한 알고리즘으로 정수형으로 바꿔 연산이 되는 듯하다.
IntegerComparator객체를 생성하여 숫자 정열
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10);
list.add(7);
list.add(5);
list.add(8);
list.add(3);
list.add(1);
Comparator<Integer> comp = new IntegerComparator();
Collections.sort(list, comp);
System.out.println(list);
}
}
class IntegerComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println("o1 : " + o1 + " o2 : " + o2);
System.out.println("o2 - o1 : " + (o2 - o1));
return o2 - o1;
}
}
-------------------------------------------------------------------------------------
o1 : 7 o2 : 10
o2 - o1 : 3
o1 : 5 o2 : 7
o2 - o1 : 2
o1 : 8 o2 : 5
o2 - o1 : -3
o1 : 8 o2 : 7
o2 - o1 : -1
o1 : 8 o2 : 10
o2 - o1 : 2
o1 : 3 o2 : 7
o2 - o1 : 4
o1 : 3 o2 : 5
o2 - o1 : 2
o1 : 1 o2 : 7
o2 - o1 : 6
o1 : 1 o2 : 3
o2 - o1 : 2
[10, 8, 7, 5, 3, 1]
Process finished with exit code 0
Collections.sort()에
숫자를 내림차순으로 정렬하는
Comparator객체를 인자로 받고 있다.
출력해 보면 o2와 o1을 서로 연산하며
정렬을 하고 있음을 확인할 수 있다.
'자바 탐구' 카테고리의 다른 글
자바) 객체 지향 프로그래밍 (0) | 2023.04.09 |
---|---|
Intellij) 테마 바꾸기 (0) | 2023.04.03 |
인터페이스) Comparable (0) | 2023.03.18 |
자료구조) 큐 (0) | 2023.03.13 |
자료구조) 우선순위 큐 (0) | 2023.03.13 |