728x90
Comparable
Comparable 인터페이스는 객체를 비교하여 정렬하는 데 사용되는 메소드인 compareTo() 메소드를 정의하고 있습니다.
비교 클래스인 compareTo()메소드는 Comparable 내부에 존재합니다.
자바에서 같은 타입의 인스턴스를 서로 비교해야만 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있습니다.
따라서 Boolean을 제외한 래퍼 클래스나 String, Time, Date와 같은 클래스의 인스턴스는 모두 정렬 가능합니다.
이때 기본 정렬 순서는 작은 값에서 큰 값으로 정렬되는 오름차순이 됩니다.
Score.java
package com.compare;
public class Score implements Comparable{
private String name;
private int kor;
private int eng;
private int math;
//기본 생성자, 파라미터 4개 생성자
public Score() {
}
public Score(String name, int kor, int eng, int math) {
this.name = name;
this.kor = kor;
this.eng = eng;
this.math = math;
}
//getter setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getSum() {
int sum = kor + eng + math;
return sum;
}
public double getAvg() {
double avg = (double)(kor + eng + math) / 3;
return avg;
}
public String getGrade() {
switch((int)getAvg()/ 10) {
case 10:
case 9:
return "A";
case 8:
return "B";
case 7:
return "C";
case 6:
return "D";
}
return "F";
}
public String toString() {
return String.format("이름 : %s\t 국어 : %d\t 영어 : %d\t 수학 : %d\n총점 : %d\t 평균 : %.2f\t 등급 : %s"
, name, kor, eng, math, getSum(), getAvg(),getGrade());
}
@Override
public int compareTo(Object o) {
Score other = (Score) o;
// 1 이면 앞의 인자가 더 큰값
// 0 이면 같은 값
// -1 이면 뒤의 인자가 더 큰값
if(this.getKor() > other.getKor()) {
return 1;
} else if(this.getKor() < other.getKor()){
return -1;
}
//this.getKor() == other.getKor()
return 0;
}
}
MTest.java
package com.compare;
import java.util.Arrays;
public class MTest {
public static void main(String[] args) {
Score[] kh = new Score[3];
kh[0] = new Score("Cine", 90, 89, 100);
kh[1] = new Score("씨네", 55, 100, 68);
kh[2] = new Score("강씨네", 100, 40, 80);
for(Score student : kh) {
System.out.println(student);
}
Arrays.sort(kh);
System.out.println("-----------------");
for(Score student : kh) {
System.out.println(student);
}
}
}
실행 결과
Comparator<T> 인터페이스
Comparator 인터페이스는 Comparable 인터페이스와 같이 객체를 정렬하는 데 사용되는 인터페이스입니다.
비교 객체인 compare가 따로 존재하며 Comparable 인터페이스를 구현한 클래스는 기본적으로 오름차순으로 정렬됩니다.
반면에 Comparator 인터페이스는 내림차순이나 아니면 다른 기준으로 정렬하고 싶을 때 사용할 수 있습니다.
즉, Comparator 인터페이스를 구현하면 오름차순 이외의 기준으로도 정렬할 수 있게 되는 것입니다.
이때 Comparator 인터페이스를 구현한 클래스에서는 compare() 메소드를 재정의하여 사용하게 됩니다.
package com.comparator;
import java.util.*;
class DescendingOrder implements Comparator<Integer> {
public int compare(Integer o1, Integer o2) {
if(o1 instanceof Comparable && o2 instanceof Comparable) {
Integer c1 = (Integer)o1;
Integer c2 = (Integer)o2;
return c2.compareTo(c1);
}
return -1;
}
}
public class Comparable02 {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<Integer>(new DescendingOrder());
ts.add(30);
ts.add(40);
ts.add(20);
ts.add(10);
Iterator<Integer> iter = ts.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
}
}
실행 결과
728x90
'Java 관련 > Java' 카테고리의 다른 글
[Java] 입출력(IO - InputOutput) (0) | 2021.11.19 |
---|---|
[Java] 예외 처리(Exception) (0) | 2021.11.18 |
[Java] 이터레이터(iterator) (0) | 2021.11.16 |
[Java] Map Collection(맵) (0) | 2021.11.15 |
[Java] Set Collection(셋 컬렉션) (0) | 2021.11.14 |