본문 바로가기

IT칼럼/JAVA

Comparable vs Comparator

<원문>

https://www.programcreek.com/2011/12/examples-to-demonstrate-comparable-vs-comparator-in-java/


Comparable과 Comparator는 Java Core API에서 제공하는 두 개의 인터페이스입니다. 그들의 이름에서 알수 있듯이, 우리는 두 인터페이스는 어떤 식 으로든 물건 비교에 사용될 수 있다고 말할 수 있습니다. 그러나 정확히 무엇이며 그것들의 차이점은 무엇입니까? 이 질문에 답하는 두 가지 예는 다음과 같습니다. 간단한 예제는 2 개의 HDTV 크기를 비교하는 것입니다. Comparable 대 Comparator를 사용하는 방법은 이래의 코드를 읽은 후 분명히 확인 할 수 있습니다.


1. Comparable


Comparable은 클래스의 객체를 다른 객체와 비교할 수 있도록 클래스에 의해 구현됩니다. 인스턴스 자체를 비교할 수 있으려면 클래스 자체가 인터페이스를 구현해야합니다. 구현에 필요한 메소드는 compareTo()입니다.  다음은 그 예입니다.


class HDTV implements Comparable<HDTV> {
private int size;
private String brand;

public HDTV(int size, String brand) {
this.size = size;
this.brand = brand;
}

public int getSize() {
return size;
}

public void setSize(int size) {
this.size = size;
}

public String getBrand() {
return brand;
}

public void setBrand(String brand) {
this.brand = brand;
}

@Override
public int compareTo(HDTV tv) {

if (this.getSize() > tv.getSize())
return 1;
else if (this.getSize() < tv.getSize())
return -1;
else
return 0;
}
}

public class Main {
public static void main(String[] args) {
HDTV tv1 = new HDTV(55, "Samsung");
HDTV tv2 = new HDTV(60, "Sony");

if (tv1.compareTo(tv2) > 0) {
System.out.println(tv1.getBrand() + " is better.");
} else {
System.out.println(tv2.getBrand() + " is better.");
}
}
}


Sony is better.


2. Comparator


어떤 상황에서는 클래스를 변경하여 비교할 수 없기를 바랄 수도 있습니다. 이 경우 특정 속성 / 필드를 기반으로 개체를 비교하려는 경우 Comparator를 사용할 수 있습니다. 예를 들어 '높이'또는 '연령'등을 기준으로 2 명을 비교할 수 있습니다 (비교할 수는 없습니다).


구현하는 데 필요한 메소드는 compare()입니다. 이제 다른 방법으로 TV를 크기별로 비교해 보겠습니다. Comparator의 일반적인 용도 중 하나는 정렬입니다. Collections 클래스와 Arrays 클래스는 모두 Comparator를 사용하는 정렬 메서드를 제공합니다.


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class HDTV {
private int size;
private String brand;

public HDTV(int size, String brand) {
this.size = size;
this.brand = brand;
}

public int getSize() {
return size;
}

public void setSize(int size) {
this.size = size;
}

public String getBrand() {
return brand;
}

public void setBrand(String brand) {
this.brand = brand;
}
}

class SizeComparator implements Comparator<HDTV> {
@Override
public int compare(HDTV tv1, HDTV tv2) {
int tv1Size = tv1.getSize();
int tv2Size = tv2.getSize();

if (tv1Size > tv2Size) {
return 1;
} else if (tv1Size < tv2Size) {
return -1;
} else {
return 0;
}
}
}

public class Main {
public static void main(String[] args) {
HDTV tv1 = new HDTV(55, "Samsung");
HDTV tv2 = new HDTV(60, "Sony");
HDTV tv3 = new HDTV(42, "Panasonic");

ArrayList<HDTV> al = new ArrayList<HDTV>();
al.add(tv1);
al.add(tv2);
al.add(tv3);

Collections.sort(al, new SizeComparator());
for (HDTV a : al) {
System.out.println(a.getBrand());
}
}
}


Panasonic
Samsung
Sony



종종 우리는 내림차순 Order Comparator를 얻기 위해 Collections.reverseOrder() 메서드를 사용할 수 있습니다. 다음과 같이 :


al.add(3);
al.add(1);
al.add(2);
System.out.println(al);
Collections.sort(al);
System.out.println(al);

Comparator<Integer> comparator = Collections.reverseOrder();
Collections.sort(al,comparator);
System.out.println(al);


[3,1,2]
[1,2,3]
[3,2,1]



'IT칼럼 > JAVA' 카테고리의 다른 글

스프링 부트 + JSP + INTELLIJ 조합에서의 404 에러 이슈  (0) 2019.03.25
isPalindrome  (0) 2019.03.08
BigInteger, BigDecimal example  (0) 2018.11.04
Priority Queue  (0) 2018.11.03
StringBuilder example  (0) 2018.11.03