본문 바로가기
자바

compare 메소드

by 근즈리얼 2021. 1. 26.
728x90

프로그래머스 문제를 풀면서 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
    }
}
728x90

'자바' 카테고리의 다른 글

자바 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

댓글