프로그래머스 문제를 풀면서 compare에 대해서 정리할 필요가 있다고 느껴서 정리를 했다!!
자바로 코딩테스트 문제를 풀때 문자열이나 배열을 비교하기 위해서 꼭 필요한 메서드라고 생각한다!
우선 가장 기본적으로 알아야 하는 사실
비교를 했을 때
A와 B를 비교
A.compareTo(B)의 경우
- A == B 일때 0을 반환
- A > B 일때 양수를 반환
- A < B 일때 음수를 변환
- 맨 첫자리부터 차례대로 비교함
*문자열 비교일 때 주의
1. 차이만큼을 반환한다.
ex) A = "abc"이고 B = "cba" 일때 -2를 반환
코드
import java.util.Arrays;
import java.util.Comparator;
public class pratice_compare {
public static void main(String[] args) {
String str = "aa";
String str1 = "bb";
String str2 = "aa";
String str3 = "a";
System.out.println(str.compareTo(str2)); // 0
System.out.println(str.compareTo(str1)); // -1
System.out.println(str.compareTo(str3)); // 1
System.out.println("=====");
Integer x = 3;
Integer y = 4;
Double z = 2.3;
System.out.println(x.compareTo(y)); // -1
System.out.println(x.compareTo(3)); // 0
System.out.println(x.compareTo(2)); // 1
System.out.println(z.compareTo(2.9)); // -1
System.out.println("=====");
String tmp = "abc";
String tmp1 = "acb";
compare com = new compare();
System.out.println(com.compare(tmp,tmp1));
System.out.println("======");
String[] test = {"abc","cea","bac"};
Arrays.sort(test, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
System.out.println(Arrays.toString(test));//[abc, bac, cea]
}
}
class compare implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}
추가적인 내용!!
내가 만든 객체를 비교할 때!!
과일이라는 클래스를 만들고 이름과 수량을 받는 객체를 만든다.
public static class Fruit{
public String name;
public int quantity;
public Fruit(String name, int quantity){
this.name = name;
this.quantity = quantity;
}
}
위의 코드는 과일 객체를 뜻한다.
이 객체의 이름으로 정렬하고 싶다면 어떻게 하면 좋을까??
바로 Comparable라는 인터페이스를 상속하는 것이다.
public static class Fruit implements Comparable<Fruit> {
public String name;
public int quantity;
public Fruit(String name, int quantity){
this.name = name;
this.quantity = quantity;
}
@Override
public int compareTo(Fruit o) {
return name.compareTo(o.name);
}
}
comparable에는 반드시 오버라이드 해야하는 메소드가 있다.
이 메소드는 현재 값과 다른 값의 이름을 비교할 수 있는 메서드다. 만약 수량으로 비교하고 싶다면
return quantity.compare(o.quantity)로 바꿔주면 된다.
이 뒤에 정렬하고 싶은 곳에서 Arrays.sort(fruits)만 해주면 이름 순이나 수량 순으로 정렬할 수 있다.
// fruits는 Fruit의 배열
근데 만약 이 코드를 쓰는 클라이언트 입장에서 어떤 경우에는 과일이름으로, 또 다른 경우에는 수량으로 정렬시키고 싶다하면 위의 클래스에 찾아가 코드를 수정해야 하는 것일까??
그래서 또 다른 방법이 있다!!
Comparator을 이용해 새로운 메서드를 만드는 것이다.
public static class Fruit{
public String name;
public int quantity;
public Fruit(String name, int quantity){
this.name = name;
this.quantity = quantity;
}
public static Comparator<Fruit> nameComparator = new Comparator<Fruit>() {
@Override
public int compare(Fruit o1, Fruit o2) {
return o1.name.compareTo(o2.name);
}
};
public static Comparator<Fruit> quantComparator = new Comparator<Fruit>() {
@Override
public int compare(Fruit o1, Fruit o2) {
return o1.quantity- o2.quantity;
}
};
}
}
Arrays.sort(fruits,Fruit.nameComparator);
Arrays.sort(fruits,Fruit.quantComparator);
위의 방법을 이용하면 이름이 필요할때는 nameComparator, 수량이 필요할때는 quantComparator을 이용해주면 된다.
전체코드
import java.util.Arrays;
import java.util.Comparator;
public class test {
public static class Fruit implements Comparable<Fruit>{
public String name;
public int quantity;
public Fruit(String name, int quantity){
this.name = name;
this.quantity = quantity;
}
@Override
public int compareTo(Fruit o) {
return name.compareTo(o.name);
}
public static Comparator<Fruit> nameComparator = new Comparator<Fruit>() {
@Override
public int compare(Fruit o1, Fruit o2) {
return o1.name.compareTo(o2.name);
}
};
public static Comparator<Fruit> quantComparator = new Comparator<Fruit>() {
@Override
public int compare(Fruit o1, Fruit o2) {
return o1.quantity- o2.quantity;
}
};
}
public static void main(String[] args) {
Fruit[] fruits = new Fruit[4];
fruits[0] = new Fruit("apple",100);
fruits[1] = new Fruit("orange",70);
fruits[2] = new Fruit("banana", 80);
fruits[3] = new Fruit("pineapple",90);
Arrays.sort(fruits);
System.out.println(fruits[1].name); // banana
Arrays.sort(fruits,Fruit.nameComparator);
System.out.println(fruits[1].name); //banana
Arrays.sort(fruits,Fruit.quantComparator);
System.out.println(fruits[0].name); // orange
}
}
'자바' 카테고리의 다른 글
자바 8 stream 기본 (0) | 2021.07.23 |
---|---|
인터페이스 기본 메소드(Default Methods) (0) | 2021.07.16 |
람다식 매소드 레퍼런스 (0) | 2021.07.13 |
함수형 인터페이스와 람다표현식 (0) | 2021.07.13 |
문자열 자르기 substring (0) | 2021.02.04 |
댓글