Comparator를 이용한 문자열 배열 정렬하기

ZOO4WE·2022년 12월 30일
0

자바

목록 보기
2/2
post-thumbnail

코딩테스트를 풀다 보면 자주 마주치는 문제가 있다. 바로 정렬이다. java 배열 정렬, java list 정렬 등 특정 키워드들로 검색하면 많은 방법을 볼 수 있다. 그 중에서도 comparator를 이용한 배열 정렬에 대하여 알아보려고 한다.

참고로 comparator, comparable 공부도 되지만 람다와 익명객체에 대한 공부도 된다.

정렬하기

우선, 기초적인 배열 오름차순 정렬 방법이다.

Arrays.sort()를 통한 정렬

import java.util.*;

public class arrayStudy {
  public void arraySort() {
		// 배열 초기화
		String[] strings = {"abd", "abb", "abc"};
		// 오름차순 정렬
	    Arrays.sort(strings);
	    // 결과값 출력
	    System.out.println(Arrays.toString(strings));
        //=>[abb, abc, abd] 출력
  }
}

배열 strings를 오름차순으로 정렬할 수 있다. 간단하고 가장 많이 나오는 예제이다.

위의 예제를 comparator를 이용하여 정렬해보기 전에 comparator 인터페이스의 compare가 무엇인지 알기 위해 예제를 통해 알아보자.

Comparator 예제

import java.util.*;

public class arrayStudy implements Comparator<String>{

	public void arraySort() {
		// 배열 초기화
		String[] strings = {"abd", "abb", "abc"};
		
        // abd와 abc 비교
        int num = compare(strings[0], strings[1]);
		
		// 결과값 출력
		System.out.println(num);
	}
    
    @Override
	public int compare(String o1, String o2) {
		return o1.compareTo(o2);
	}

}

오버라이딩한 compare 메소드의 설명은 아래와 같다.

두개의 인자를 비교하여 정렬해주며 결과값으로 기준값(o1)보다 비교값(o2)이 크면 -1, 기준값과 비교값이 같으면 0, 기준값이 비교값보다 크면 1을 리턴해준다고 한다.

o1 < o2 ==> -1
o1 == o2 ==> 0
o1 > o2 ==> 1

그렇다면 abd와 abc를 비교했을 때의 결과는 어떻게 될까?

바로 1이 출력된다.

그럼 compare 메소드를 재사용할 일이 없으니 익명객체로 만들어보자.

Comparator를 통한 정렬

import java.util.*;

public class arrayStudy{

	public void arraySort() {
		// 배열 초기화
		String[] strings = {"abd", "abb", "abc"};
		
		// 오름차순 정렬
		Arrays.sort(strings, new Comparator<String>() {
			
			@Override
			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
		});
		
		// 결과값 출력
		System.out.println(Arrays.toString(strings));
	}
}

이는 람다로도 발전시킬 수 있다.

람다를 통한 정렬


import java.util.*;

public class arrayStudy{

	public void arraySort() {
		// 배열 초기화
		String[] strings = {"abd", "abb", "abc"};
		
		// 람다를 이용한 오름차순 정렬
		Arrays.sort(strings, (o1, o2) -> o1.compareTo(o2));
		
		// 결과값 출력
		System.out.println(Arrays.toString(strings));
	}
}

다양한 기준으로 정렬하기

그렇다면 고작 Arrays.sort를 이용하여 끝날 정렬을 왜 굳이 Comparator 인터페이스를 이용하고 귀찮게 하는 걸까?

만약, 우리가 글자수를 이용하여 정렬을 한다고 하면 어떨까?
정렬의 특정 조건을 추가한다면? 이를테면 몇번째 글자로 정렬한다는 조건을 추가한다면?

Comparator 인터페이스 혹은 람다를 이용한다면 위와 같은 문제는 꽤나 어렵지 않게 해결할 수 있다.

글자수 기준으로 Arrays.sort()를 이용한 정렬하기

package com.module.study.arrayList;
import java.util.*;

public class arrayStudy{

	public void arraySort() {
		// 배열 초기화
		String[] strings = {"aaaaaaa", "abb", "adddddddddwdasrawerasdfasd"};
		
        // 오름차순 정렬하기
		Arrays.sort(strings);
		
		// 결과값 출력
		System.out.println(Arrays.toString(strings));
	}
}

우리가 원하는 결과값은 {abb, aaaaaaa, adddddddddwdasrawerasdfasd} 이지만 역시 세상은 호락호락하지 않다.

그렇다면 Comparator를 이용해보자.

글자수 기준으로 Comparator를 이용한 정렬하기

package com.module.study.arrayList;
import java.util.*;

public class arrayStudy{

	public void arraySort() {
		// 배열 초기화
		String[] strings = {"aaaaaaa", "abb", "adddddddddwdasrawerasdfasd"};
        
        // 오름차순 정렬하기
        Arrays.sort(strings, new Comparator<String>() {
			
			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}
		});
		
		// 결과값 출력
		System.out.println(Arrays.toString(strings));
	}
}

결과값이 드디어 abb, aaaaaaa, adddddddddwdasrawerasdfasd로 출력된다.
aaaaaaa와 abb를 놓고 비교했을 때, aaaaaa의 길이는 7이고 abb는 3이기 때문에

o1(7) > o2(3) ==> 1

의 결과값으로 정렬이 된 것이다.

이는 람다로도 가능하다.

글자수 기준으로 람다를 이용한 정렬하기


import java.util.*;

public class arrayStudy{

	public void arraySort() {
		// 배열 초기화
		String[] strings = {"aaaaaaa", "abb", "adddddddddwdasrawerasdfasd"};
		
		//오름차순 정렬
		Arrays.sort(strings, (o1, o2) -> o1.length() - o2.length());
		
		// 결과값 출력
		System.out.println(Arrays.toString(strings));
	}
}

이 결과값은 다양한 정렬을 가능케 해준다.

+보너스

프로그래머스 문자열 내 마음대로 정렬하기

import java.util.*;

public class arrayStudy{

	public void arraySort() {
		// 배열 초기화
		String[] strings = {"abcd", "abce", "cdx"};
		int n = 2;
		
		Arrays.sort(strings, new Comparator<String>() {
			
			@Override
			public int compare(String o1, String o2) {
				
				if(o1.charAt(n) == o2.charAt(n)) {
					return o1.compareTo(o2);
				}
				return o1.charAt(n) - o2.charAt(n);
			}
		});
		
		
		// 결과값 출력
		System.out.println(Arrays.toString(strings));
	}
}

개인적으로 마지막 보너스 문제를 풀기 위하여 공부했다.

  1. Arrays.sort()
  2. Comparator 인터페이스
  3. 익명객체
  4. 람다식

위의 것들을 공부하는 계기가 되었다.

참고자료
https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary
https://st-lab.tistory.com/243

profile
직장인 K씨의 개발스러운 일일

0개의 댓글