JAVA

Comparator

오매준 2024. 5. 27. 17:56

# Comparable
 

 

  - 이 인터페이스를 구현한 클래스는 크기 비교가 가능해진다
  - compareTo() 메서드를 구현해두면 크기 비교가 필요한 상황에서
    해당 메서드를 호출해 크기를 비교할 수 있게 된다
 

# Comparator
 

  - 이 인터페이스를 구현한 클래스는 크기 비교의 기준이 된다
  - 이 인터페이스를 구현한 클래스의 인스턴스를 필요한 상황에서 함께 전달할 수 있다

 


Wrapper 클래스들은 Comparable이 이미 구현되어 있으므로

compareTo() 메서드를 직접 구현할 필요가 없다

List<Integer> nums = new ArrayList<>();

Collections.addAll(nums, 88, 89, 90, 15, 10, 11, 12, 13, 1, 99);

Collections.sort(nums);

System.out.println(nums);


Comparable 인터페이스를 구현한 클래스는 각 인스턴스끼리의 크기 비교가 가능해진다
(-> 정렬이 가능해 진다)

class Grape implements Comparable<Grape> {
	String farm;
	int qty;
	double sweet;
	String grade;
	
	public Grape(String farm, int qty, double sweet, String grade) {
		this.farm = farm;
		this.qty = qty;
		this.sweet = sweet;
		this.grade = grade;
	}
}

먼저 Comparable을 상속받는 Grape 클래스를 만들어준다

그 후 Grape 클래스 안에 compareTo() 메서드를 override

@Override
	public int compareTo(Grape g) {
		/*
			현재 인스턴스와 매개변수로 전달받은 인스턴스를 비교하였을 때
			
			어떤 것이 더 크다고 판정할것인지 정해야 한다
			
			두 인스턴스의 크기가 같다 : 0을 리턴
			현재 인스턴스의 크기가 더 크다 : 1을 리턴
			매개변수 인스턴스의 크기가 더 크다 : -1을 리턴
		 */
		
		// 예시: 포도알의 개수를 기준으로 두 인스턴스의 크기를 비교
		if (this.qty == g.qty) {
			// 포도알 개수가 같으면 당도를 기준으로 다시 크기 비교
			if (this.sweet == g.sweet) {
				return 0;
			} else if (this.sweet > g.sweet) {
				return 1;
			} else {
				return -1;
			}
			
		} else if (this.qty > g.qty) {
			return 1;
		} else {
			return -1;
		}
	}
List<Grape> grapes = new ArrayList<>();