SSISO Community

시소당

자바에서 문자열 비교, Collator

출처 : 문자열 오브젝트 비교법

SDN 에 문자열 오브젝트의 비교법에 관한 팁이 올라와서 살펴봤는데, 다소 생소한 클래스를 하나 소개하고 있었다. Collator라는 클래스인데, java.text.Collator에 위치하는 녀석이다. 자바에서 문자열간의 비교를 하는 기존의 방법들(==, equals(), compareTo()에 의한 방법)을 소개하고, 마지막으로 Collator 클래스를 소개하고 있는데, Collator 클래스의 가장 큰 특징은 어느정도의 자연어 비교, 즉 지역고유의 문자열 처리를 해준다는 것이다.

예를 들어보자.

public class StringTest {

       public static void main(String[] args) {

             String w1 = "cat";

             String w2 = "hat";

             int comparison = w1.compareTo(w2);

             if (comparison < 0) {

                    System.out.printf("%s < %s\n", w1, w2);

             } else {

                    System.out.printf("%s < %s\n", w2, w1);

             }

       }

}


먼저 위와 같이 compareTo()를 이용하여 둘 문자열을 비교했을 때의 실행 결과는

cat < hat

가 된다. 이렇게 되는 것이 당연한 결과이긴 하나 만약 사전을 이용할 때와 같은 비교를 수행하기에는 부적합한 결과를 낼 수 있다. 즉, hat 대신 Hat을 집어넣었을 경우, 위 프로그램의 실행 결과는 반대가 되는데, 대문자가 아스키 코드상으로 앞서기 때문이다. 또한 동일성 문제도 있을 수 있는데 예를 들어 한 불어식 이름이 서로 다른 표현방법을 거칠 경우 두 문자열을 서로 다른 것으로 인식할 가능성이 생길 수 있다.

동일성 문제를 확인할 수 있는 코드

public class StringTest {

       public static void main(String[] args) {

             String name1 = "Michele";

             String name2 = "Miche\u0300le"; //U+0300 is the COMBINING GRAVE ACCENT

             if (name1.equals(name2)) {

                    System.out.println("The strings are equal.");

             } else {

                    System.out.println("The strings are unequal.");

             }

       }

}


위 프로그램의 실행 결과는 아래와 같다.

The strings are unequal.


이번에는 위 프로그램들의 문제점을 해결하기 위한 방법으로 Collator 클래스를 사용하는 코드는 아래와 같다.

import java.text.Collator;

import java.util.Locale;

 

public class StringTest {

       public static void main(String[] args) {

             Collator collator = Collator.getInstance(new Locale("en", "US"));

             int comparison = collator.compare("cat", "Hat");

             if (comparison < 0) {

                    System.out.printf("%s < %s\n", "cat", "Hat");

             } else {

                    System.out.printf("%s < %s\n", "Hat", "cat");

             }

       }

}


위 코드의 실행결과는 아래와 같다.

cat < Hat


이는 Collator 클래스가 사전에서 cat이 Hat보다 먼저 나오는 사실을 이해하기 때문이라고 한다. 이번에는 위에 나왔던 동일성 문제를 해결하는 Collator 클래스 사용예제를 보도록 하자.

import java.text.Collator;

import java.util.Locale;

 

public class StringTest {

       public static void main(String[] args) {

             Collator collator = Collator.getInstance(Locale.US);

             String name1 = "Michele";

             String name2 = "Miche\u0300le";

            

             int comparison = collator.compare(name1, name2);

             if (comparison == 0) {

                    System.out.println("The strings are equal.");

             } else {

                    System.out.println("The string are unequal.");

             }

       }

}


위 코드의 실행결과는 아래와 같이 우리가 기대하던 바이다.

The strings are equal.


출처 : http://decoder.tistory.com/24

2132 view

4.0 stars