자바 공부 기록(15)-Comparator 와 Comparable, 예제
my code archive
반응형
Comparator 와 Comparable

객체 정렬에 필요한 메서드(정렬 기준 제공)를 정의한 인터페이스.

- Comparator : 기본 정렬 기준을 구현하는데 사용

- Comparable : 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용

public interface Comparator{
int compare(Object o1, Object o2){
//결과가 0 이면 같은 것.
//양수면 왼쪽이 더 크다, 음수면 오른쪽이 더 크다.
boolean equals(Object obj);
}

public interface Comparable{
int compareTo(Object o); //자기 자신과 비교
}

-compare()와 compareTo()는 두 객체의 비교 결과를 반환하도록 작성,

같으면 0, 오른쪽이 크면 음수(-), 작으면 양수(+).

 

Integer와 Comparable

Integer, String 등 정렬이 가능한 클래스는 기본적으로 정렬 기준을 갖고 있다.

 

public final class Integer extends Number implements Comparable{
....
public int compareTo(Object o){
	return compareTo((Integer)o);
}

public int compareTo(Integer anotherInteger){
	int thisVal = this.value;
    int anotherVal = anotherInteger.value;
    
    //비교하는 값이 크면 -1, 같으면 0, 작으면 1을 반환한다.
    return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
   }
}

쉽게 생각해서 뺄셈이라고 생각하면 된다.

A - B를 했을 때 0이 나오면 => A = B,

                     음수가 나오면 => A<B

                     양수가 나오면 => A>B

자바의 정석 연습문제 예제
import java.util.*;

class Student {
	String name;
	int ban;
	int no;
	int kor,eng,math;
	
	Student(String name,int ban,int no, int kor, int eng, int math){
		this.name=name;
		this.ban=ban;
		this.no=no;
		this.kor=kor;
		this.eng=eng;
		this.math=math;
	}
	int getTotal() {
		return kor+eng+math;
	}
	float getAverage() {
		return (int)((getTotal()/3f)*10+0.5)/10f;
	}
	public String toString() {
		return name+","+ban+","+no+","+kor+","+eng+","+math
				+","+getTotal()+","+getAverage();
	}
}

public class Exercise11_5 {
	public static void main(String[] args) {
		ArrayList list=new ArrayList();
		list.add(new Student("홍길동",1,1,100,100,100));
		list.add(new Student("남궁성",1,2,90,70,80));
		list.add(new Student("김자바",1,3,80,80,90));
		list.add(new Student("이자바",1,4,70,90,70));
		list.add(new Student("안자바",1,5,60,100,80));
		
		Collections.sort(list);
		Iterator it=list.iterator();
		
		while(it.hasNext())
			System.out.println(it.next());
	}

}

 

Comparable 인터페이스를 구현하도록 변경해서
이름(name)이 기본 정렬이 기준이 되도록,
실행 결과가 이렇게 나오도록 해보기
김자바,1,3,80,80,90,250,83.3
남궁성,1,2,90,70,80,240,80.0
안자바,1,5,60,100,80,240,80.0
이자바,1,4,70,90,70,230,76.7
홍길동,1,1,100,100,100,300,100.0
Comparable 인터페이스 구현
class Student implements Comparable{
	String name;
	int ban;
	int no;
	int kor,eng,math;
Comparable 인터페이스에는 comepareTo()메서드가
정의되어 있고 이 메서드는 정렬기준을 제공한다.
public int compareTo(Object o) {
		if(o instanceof Student) {
			Student tmp=(Student)o;
			
			return name.compareTo(tmp.name);  //String 클래스의 compareTo() 호출
		}else {
			return -1;
		}
	}

 

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형