728x90
반응형
Comparable
- 이 인터페이스를 구현한 클래스는 비교가 가능해진다.
- 크기 비교가 필요한 상황이 발생하면 compareTo() 메서드를 활용한다.
ex > 정렬 등
Comparator
- 이 인터페이스를 구현한 클래스는 크기 비교의 기준이 된다.
- 해당 클래스의 인스턴스를 정렬 기준으로 함께 전달할 수 있다.
// Comparable 인터페이스를 구현하여 크기 비교가 가능한 객체로 만들어주면
// 정렬이 가능해진다.
class Grape implements Comparable<Grape> {
int price;
int qty;
int taste;
String farm;
public Grape(int price, int qty, int taste, String farm) {
this.price = price;
this.qty = qty;
this.taste = taste;
this.farm = farm;
}
@Override
public String toString() {
return String.format("%d/%d/%s\n", price, qty, taste, farm);
}
@Override
public int compareTo(Grape o) {
// 현재 인스턴스와 매개변수로 전달되는 인스턴스를 비교해야 한다.
// 두 객체의 크기가 같다 : 0을 리턴
// 두 객체 중 왼쪽의 크기가 크다 : 1을 리턴
// 두 객체 중 오른쪽의 크기가 크다 : -1을 리턴
if (this.price == o.price) {
return 0;
} else if (this.price > o.price) {
return 1;
} else {
return -1;
}
}
}
// 비교 기준이 될 수 있는 클래스
class 포도알개수검사기 implements Comparator<Grape> {
@Override
public int compare(Grape o1, Grape o2) {
if (o1.qty == o2.qty) {
return 0;
} else if (o1.qty > o2.qty) {
return 1;
} else {
return -1;
}
}
}
class Peach implements Comparable<Peach> {
int price;
int taste;
double weight;
char grade;
String farm;
public Peach(int price, int taste, double weight, char grade, String farm) {
this.price = price;
this.taste = taste;
this.weight = weight;
this.grade = grade;
this.farm = farm;
}
@Override
public int compareTo(Peach o) {
return this.weight == o.weight ? 0 : ((this.weight > o.weight) ? 1 : -1);
}
@Override
public String toString() {
return String.format("%s의 복숭아 정보: %d원 / 맛: %d점 / %.1fg / %c등급\n", farm, price, taste, weight, grade);
}
}
class PeachComparatorFarmAsc implements Comparator<Peach> {
@Override
public int compare(Peach o1, Peach o2) {
String farm1 = o1.farm;
String farm2 = o2.farm;
int len1 = farm1.length();
int len2 = farm2.length();
// 둘 중 더 짧은 단어까지 반복하게 된다.
for (int i = 0; i < len1 && i < len2; ++i) {
char ch1 = farm1.charAt(i);
char ch2 = farm2.charAt(i);
if (ch1 == ch2) {
continue;
} else {
return ch1 - ch2;
}
}
// 두 단어 중 더 짧은 단어까지는 모두 일치했다면 이곳에 도착
// coke, cokezero
if (len1 == len2) {
return o2.taste - o1.taste;
} else {
return len1 - len2;
}
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class D06_Comparator {
public static void main(String[] args) {
List<Integer> nums = new ArrayList<>();
List<Grape> grapes = new ArrayList<>();
Collections.addAll(nums, 88, 10, 25, 30, 3200, 4600, 500);
Collections.addAll(grapes,
new Grape(4000, 40, 10, "김씨네농장"),
new Grape(3800, 38, 10, "전국사슴농장"),
new Grape(3300, 35, 9, "양떼목장"),
new Grape(3600, 41, 7, "송파산골농장"),
new Grape(3780, 36, 8, "전국사슴농장"));
System.out.println("정렬 전: " + nums);
System.out.println("정렬 전: " + grapes);
Collections.sort(nums);
// 기본 정렬은 Comparable이 구현된 객체만 허용한다.
// - Integer, String 등 기본 클래스들은 Comparable이 구현된 상태
// Collections.sort(grapes);
// 정렬의 기준을 우리가 직접 만들어 전달할 수도 있다.
Collections.sort(grapes, new 포도알개수검사기());
System.out.println("정렬 후: " + nums);
System.out.println("정렬 후: " + grapes);
Collections.reverse(nums);
Collections.reverse(grapes);
System.out.println("뒤집은 후: " + nums);
System.out.println("뒤집은 후: " + grapes);
List<Peach> peaches = new ArrayList<>();
Collections.addAll(peaches,
new Peach(1000, 4, 89.1, 'B', "Cat"),
new Peach(1000, 4, 89.1, 'B', "CatTower Farm"),
new Peach(1000, 4, 89.1, 'B', "Cat"),
new Peach(1000, 4, 89.1, 'B', "CatTower Farm"),
new Peach(1000, 4, 89.1, 'B', "Cat"),
new Peach(1000, 4, 89.1, 'B', "CatTower Farm"),
new Peach(1000, 4, 89.1, 'B', "Cat"),
new Peach(1000, 4, 89.1, 'B', "CatTower Farm"),
new Peach(1000, 6, 100.0, 'A', "Seoul Farm"),
new Peach(1000, 4, 89.1, 'B', "Seoul2 Farm"),
new Peach(1000, 6, 100.0, 'A', "Seoul Farm"),
new Peach(1000, 4, 89.1, 'B', "Seoul2 Farm"),
new Peach(1000, 6, 100.0, 'A', "Seoul Farm"),
new Peach(800, 6, 97.4, 'C', "Great Farm"),
new Peach(1000, 6, 100.0, 'A', "Seoul Farm"),
new Peach(1000, 6, 100.0, 'A', "Seoul Farm"),
new Peach(1500, 9, 120.5, 'A', "Jeju Farm"),
new Peach(1000, 4, 89.1, 'B', "Seoul2 Farm"),
new Peach(1000, 4, 89.1, 'B', "Seoul3 Farm"),
new Peach(1000, 4, 89.1, 'B', "Seoul3 Farm"),
new Peach(1000, 4, 89.1, 'B', "Seoul2 Farm"),
new Peach(3000, 10, 152.6, 'A', "Roa Farm"));
Collections.sort(peaches);
System.out.println("기본 정렬: " + peaches);
Collections.sort(peaches, new PeachesGradeSort());
Collections.reverse(peaches);
System.out.println("등급 오름차순 정렬: " + peaches);
Collections.sort(peaches, new PeachesFarmSort());
Collections.reverse(peaches);
Collections.reverse(peaches);
System.out.println("농장명 오름차순 정렬: " + peaches);
}
}
728x90
반응형
'JAVA > 기본 이론' 카테고리의 다른 글
JAVA | String class (0) | 2023.04.10 |
---|---|
JAVA | Map (0) | 2023.04.10 |
JAVA | Collections (0) | 2023.04.05 |
JAVA | Wrapper Class (0) | 2023.04.05 |
JAVA | Generic (0) | 2023.04.05 |