mingg IT

[Java] compare 메서드 Override, 특정 규칙에 따라 정렬하기 본문

코딩테스트

[Java] compare 메서드 Override, 특정 규칙에 따라 정렬하기

mingg123 2021. 7. 25. 14:29

방법 1

Arrays.sort 내에서 compare 메서드 override 

 

compareTo 함수는 int의 경우 비교값 a, b가 있을 때

a > b 일 경우 result = 1

a = b 일 경우 result = 0

a < b 일 경우 result = -1

 

import java.util.*;
class Solution {                                                                                       
    public int compareNumber (String o1, String head) {
        String num = o1.substring(head.length());
        String newStr = "";
        // TAIL을 제외한 방법 
        for(int i = 0; i < num.length(); i++) {
            if(Character.isDigit(num.charAt(i))) {
                newStr = newStr + Character.toString(num.charAt(i));
            } else break;
        }
        return  Integer.parseInt(newStr);
  
    }
    public String[] solution(String[] files) {
        String[] answer = new String[files.length];
        //Compare 메서드 오버라이드 
        Arrays.sort(files, new Comparator<String> () {
           @Override
            public int compare(String o1, String o2) {
                String head1 = o1.split("[0-9]")[0];
                String head2 = o2.split("[0-9]")[0];
                
                int result = head1.toLowerCase().compareTo(head2.toLowerCase());
                //head가 같을경우 
                if(result == 0) {
                    result = compareNumber(o1, head1) - compareNumber(o2, head2);
                }
                return result;
            }
        });
        return files;
    }
}

 

 

방법 2

 

클래스에서 Comparator 인터페이스의 compare 메서드를 override한다. 

  //interface compare 메서드를 override한 class 정의 
    class CustomComparator implements Comparator<String> {
        @Override
        public int compare(String o1, String o2) {
            String head1 = o1.split("[0-9]")[0];
            String head2 = o2.split("[0-9]")[0];
                
            int result = head1.toLowerCase().compareTo(head2.toLowerCase());
            //head가 같을경우 
            if(result == 0) {
                result = compareNumber(o1, head1) - compareNumber(o2, head2);
            }
            return result;
        }
    }

방법 2를 사용한 전체 코드 

import java.util.*;
class Solution {   
    class CustomComparator implements Comparator<String> {
        @Override
        public int compare(String o1, String o2) {
            String head1 = o1.split("[0-9]")[0];
            String head2 = o2.split("[0-9]")[0];
                
            int result = head1.toLowerCase().compareTo(head2.toLowerCase());
            //head가 같을경우 
            if(result == 0) {
                result = compareNumber(o1, head1) - compareNumber(o2, head2);
            }
            return result;
        }
    }
    public int compareNumber (String o1, String head) {
        String num = o1.substring(head.length());
        String newStr = "";
        // TAIL을 제외한 방법 
        for(int i = 0; i < num.length(); i++) {
            if(Character.isDigit(num.charAt(i))) {
                newStr = newStr + Character.toString(num.charAt(i));
            } else break;
        }
        return  Integer.parseInt(newStr);
  
    }
    public String[] solution(String[] files) {
        String[] answer = new String[files.length];
        //Compare 메서드 오버라이드 
        Arrays.sort(files, new CustomComparator());
     
        return files;
    }
}

 

관련된 문제

https://programmers.co.kr/learn/courses/30/lessons/17686

 

 

 

Comments