В мире существует огромное количество языков и диалектов. Каждый со своими особенностями и алфавитом. Некоторые даже используют письмо справа налево, а не слева направо.
Вы, наверное, также как и я сравнивали всю жизнь строки в Java с помощью метода compareTo в String:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Main { public static void main(String[] args) throws InterruptedException { String str1 = "Avalon"; String str2 = "Isle"; int result = str1.compareTo(str2); if (result < 0) { System.out.println( String.format("%s must be before %s.", str1, str2)); } else if (result == 0) { System.out.println( String.format("%s and %s are identical.", str1, str2)); } else { System.out.println( String.format("%s must be after %s.", str1, str2)); } } } |
В консоли будет выведено:
1 |
Avalon must be before Isle. |
Этот метод осуществляет сортировку в соответствии с кодом символа в Юникод, то есть для большинства языков (и для русского в том числе) сравнение получается вполне корректным. Про метод compareTo и другие методы в классе String можно прочесть в моём учебнике.
Но сортировка получается правильной не для всех. Для правильного сравнения строк нужно обязательно учитывать язык, на котором написаны эти строки, то есть нужно учитывать Locale. В метод compareTo нельзя передать Locale, для правильного сравнения строк в соответствии с конкретной локалью нужно использовать класс java.text.Collator:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.text.Collator; public class Main { public static void main(String[] args) throws InterruptedException { String str1 = "Avalon"; String str2 = "Isle"; // Получаем экземпляр Collator в соответствии // с американской локалью: Collator collator = Collator.getInstance(java.util.Locale.US); // Или можно получить экземпляр для текущей локали: // Collator.getInstance(); int result = collator.compare(str1, str2); if (result < 0) { System.out.println( String.format("%s must be before %s.", str1, str2)); } else if (result == 0) { System.out.println( String.format("%s and %s are identical.", str1, str2)); } else { System.out.println( String.format("%s must be after %s.", str1, str2)); } } } |
Результат:
1 |
Avalon must be before Isle. |
Использовать Collator для сравнения строк на английском языке особого смысла нет, да и для русского он не особо полезен. Он может быть полезен в случаях, когда вы используете какой-нибудь более экзотический язык.
Также Collator может пригодиться, если вам нужно сравнивать строки так, чтобы буквы «ё» и «е» считались одинаковыми. Для этого нужно использовать метод setStrength, который имеет параметр, влияющий на сравнение. Параметр может принимать четыре значения, воздействие которых зависит от Locale для которого создан Collator. Вот эти четыре значения: PRIMARY, SECONDARY, TERTIARY и IDENTICAL. Пример кода, который сравнивает строки, считая «Ё» и «Е» идентичными буквами, а также не учитывает регистр символов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.text.Collator; public class Main { public static void main(String[] args) throws InterruptedException { String str1 = "Ежик"; String str2 = "ЁЖик"; Collator collator = Collator.getInstance(new java.util.Locale("ru", "RU")); collator.setStrength(Collator.PRIMARY); int result = collator.compare(str1, str2); if (result < 0) { System.out.println( String.format("%s must be before %s.", str1, str2)); } else if (result == 0) { System.out.println( String.format("%s and %s are identical.", str1, str2)); } else { System.out.println( String.format("%s must be after %s.", str1, str2)); } } } |
Результат:
1 |
Ежик and ЁЖик are identical. |
Ссылки: