Локализованное упорядочение без учета регистра в Java

У меня есть набор наборов строк через дефис. Что я хочу отсортировать с учетом локали.

List<String> words = Arrays.asList("App - Small", "Apple", "App - Big");

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

// Sort Method 1            
Collections.sort(words, String.CASE_INSENSITIVE_ORDER);
System.out.println(words.toString());

// Sort Method 2        
collator.setStrength(Collator.PRIMARY);
Collections.sort(words, collator);
System.out.println(words.toString());

Результат

String.CASE_INSENSITIVE_ORDER

[App - Big, App - Small, Apple]  

Collator.PRIMARY

[App - Big, Apple, App - Small]

Хотя предполагается, что Collator.PRIMARY выполняет сортировку без учета регистра, существует разница между порядком с использованием двух вышеуказанных методов. Как я могу добиться порядка сортировки на основе локали без учета регистра, который работает с дефисом.

[Приложение — большое, Приложение — маленькое, Apple] — ожидаемый порядок сортировки


person aquitted-mind    schedule 28.10.2013    source источник
comment
Я использую TreeMap, поэтому я написал это изначально. Отредактировано, чтобы удалить это из темы. Что касается порядка сортировки, который является ожидаемым результатом моего приложения.   -  person aquitted-mind    schedule 28.10.2013


Ответы (2)


Ниже приведена цитата из API.

Это зависит не только от силы, но и от других вещей. Заключите дефис ('-') между одинарными кавычками, и вы получите желаемый результат ''

Определения элементов правила следующие:

  • Text-Argument: Текстовый аргумент — это любая последовательность символов, за исключением специальных символов (то есть общих пробелов [0009-000D, 0020] и символов синтаксиса правила [0021-002F, 003A-0040, 005B-0060, 007B- 007E]). Если нужны эти символы, вы можете поместить их в одинарные кавычки (например, амперсанд => '&'). Обратите внимание, что символы пробела без кавычек игнорируются; например b c рассматривается как bc.

http://docs.oracle.com/javase/7/docs/api/java/text/RuleBasedCollator.html#compare(java.lang.String, java.lang.String)

person Abhijith Nagarajan    schedule 28.10.2013
comment
Спасибо за ваш ответ. - person aquitted-mind; 28.10.2013

Здесь нет проблемы с чувствительностью к регистру. Сопоставитель игнорирует пробелы и дефисы, поэтому, поскольку все строки начинаются с «App», в вашем примере значащими буквами являются «S», «l» и «B», а результирующий порядок «B» «L» «S» равен правильный.

person Holger    schedule 28.10.2013
comment
Взгляните на stackoverflow.com/questions/16567287/ для получения дополнительной информации. - person Chill; 28.10.2013
comment
Спасибо за ваш ответ. - person aquitted-mind; 28.10.2013