как сортировать неанглийские строки?

Я искал ответы, и они подходят для стандартного алфавита. а у меня другая ситуация.

Итак, я программирую на Java. Я пишу определенную программу. эта программа имеет в каком-то месте некоторый список строковых элементов. Я хотел бы отсортировать эти строковые элементы в соответствии с алфавитом.

если бы я отсортировал его по английскому алфавиту, это было бы легко, так как обычно все кодовые страницы совместимы с американским стандартным кодом для обмена информацией (ASCII), и в них уже отсортированы все буквы английского алфавита, поэтому, если я хочу отсортировать мой список, мне нужно было бы только сравнить значения символов, чтобы определить, какая буква куда идет.

но моя проблема в том, что я не хочу сортировать список с помощью английского алфавита. моя программа имеет возможность отображения на английском или некоторых других языках. проблема в том, что некоторые из этих языков имеют алфавит, отличный от английского алфавита, поэтому буквы не совпадают с буквами в английском алфавите, и поэтому просто ‹, и > проверка значений char не работает, потому что буквы неправильно сортируются в кодовая страница.

для целей этого вопроса скажем, что английский алфавит выглядит следующим образом:

a,
b,
c,
d,
e,
f,
g.

скажем, есть некая страна под названием «ABC», чей алфавит выглядит так:

d,
b,
g,
e,
a,
c,
f.

прежде всего, если a равно 97 на кодовой странице, b 98, c 99 и так далее, как я могу отсортировать свой список, используя второй алфавит в этом примере, поскольку во втором алфавите первая буква равна 100, вторая равна до 98, третий до 103 и так далее?

и мой второй вопрос: к сожалению, в некоторых странах, которые я переводю, моя программа тоже имеет алфавит, где некоторые комбинации букв рассматриваются как одна буква. для моего второго примера предположим, что страна «def» имеет следующий алфавит:

d,
g,
be,
e,
fe,
c,
f.

здесь: д - первая буква в алфавите, г - вторая буква в алфавите, бэ - третья буква в алфавите (ОДНА буква, хотя и пишется как две буквы, но считается именно одной буквой, и имеет свою положение в алфавите), e - четвертая буква в алфавите, the - пятая буква в алфавите (также пишется как две буквы, но трактуется как ОДНА буква), c - шестая буква в алфавите, f - седьмая буква в алфавите .

как вы можете видеть в этом воображаемом примере номер 2 воображаемой страны "def", эта страна действительно испортила алфавит. и после представления этих двух примеров этих двух алфавитов двух воображаемых стран вы понимаете, почему я не могу использовать стандартный метод сортировки строк.

Итак, не могли бы вы помочь мне с этой сортировкой. Я не уверен, что я могу сделать, чтобы отсортировать по этому испорченному алфавиту.

post scriptum: строки ниже не важны для вопроса, но они просто дополнительная информация, если кто-то хочет знать, где я нашел такой испорченный алфавит

Ну, я привел те примеры, которые состоят из 7 случайно упорядоченных букв только для целей этого вопроса - чтобы сделать его более простым. если вам интересно, в чем моя настоящая проблема - я пытаюсь перевести свою программу на хорватский. Хорватский алфавит действительно испорчен, потому что он выглядит следующим образом:

1 |a
2 |b
3 |c
4 |č
5 |ć
6 |d
7 |đ
8 |đž
9 |e
10|f
11|g
12|h
13|i
14|j
15|k
16|l
17|lj
18|m
19|n
20|nj
21|o
22|p
23|r
24|s
25|š
26|t
27|u
28|v
29|z
30|ž

как видите, хорватский алфавит чем-то похож на английский алфавит, но большинство букв находятся не в том же месте, что и английские, а некоторые из них вообще не существуют в английском алфавите, а несколько букв представляют собой одну букву, которая пишется двумя буквами. так действительно трудно сортировать. поэтому я надеюсь, что кто-то знает какой-то способ сделать это. конечно, есть самый глупый метод для сортировки, который всегда будет работать и может сортировать что угодно, и это метод с оператором switch, где я сравниваю два элемента строки, и для каждой буквы я использую оператор switch, где оператор switch имеет 31+default= 32 корпуса, из которых каждый имеет свой переключатель с 32 корпусами. что в общей сложности 1024 случая, и если мой средний случай имеет 4 строки кода, я получаю, что если я хочу сортировать строки с использованием неанглийского алфавита, мой метод сортировки будет иметь длину не менее 4096 строк. и это огромный метод. это самый глупый способ сортировки, но только один я могу понять на данный момент. поэтому я спрашиваю здесь, потому что надеюсь, что кто-то знает какой-нибудь более простой способ сделать это. метод, который не так велик, как 4k строк кода, просто для сортировки глупых строк. У меня есть метод сортировки английских строк, и он занимает чуть больше 10 строк кода. Я надеюсь, что кто-то может предложить мне что-то меньше, чем 4k строк кода.

так что, если кто-нибудь знает более простое решение, я был бы признателен.

спасибо


person SYOB SYOT    schedule 19.12.2016    source источник
comment
Разве đž, lj и nj не являются отдельными буквами в хорватском языке? Они находятся в этой статье Википедии: https://en.wikipedia.org/wiki/Gaj%27s_Latin_alphabet#Digraphs. Возможно, вам придется обрабатывать оба варианта, но я думаю, вы обнаружите, что dž, lj и nj лучше работают с Locale, чем с версиями без орграфа (неправильными?).   -  person Tom Blodget    schedule 19.12.2016
comment
эй, да, это правильно. это то, что затрудняет сортировку. так как, например, l — это одна буква, j — это другая, но когда они стоят одна за другой, они считаются третьей буквой. я упомянул об этом в своем вопросе. но в любом случае ответ ниже работает хорошо, и он правильно сортирует письма, так что мне больше не нужно об этом беспокоиться.   -  person SYOB SYOT    schedule 19.12.2016
comment
Хорошо. Я хочу сказать, что для орграфов есть отдельные символы. Попробуйте скопировать одно из последнего предложения в моем предыдущем комментарии.   -  person Tom Blodget    schedule 20.12.2016
comment
да неужели? я этого не заметил. Спасибо. Я не знал, что у этих символов есть свой код. я думал, что они всегда пишутся как два символа lj или nj... круто, теперь я узнал кое-что новое. но я не думаю, что я буду применять его. потому что мое приложение является консольным приложением (хотя оно имеет какой-то графический интерфейс), но я использую одну кодовую страницу в своей программе, и эта кодовая страница имеет все хорватские буквы, а только такие буквы, как lj nj и đž, не существует как одна буква. я просмотрел всю кодовую страницу от символа 1 до 32768, и я не нашел там этих букв.   -  person SYOB SYOT    schedule 20.12.2016
comment
так как эта кодовая страница имеет l j n đ ž как отдельные буквы, я включу поддержку только для них. кроме того, не требуется обрабатывать как đ ž как две буквы, так и đž как одну букву, потому что даже в хорватской раскладке эти символы не являются одной буквой. это означает, что когда пользователи печатают, им нужно будет ввести, например, đž đ, а затем ž, потому что нет клавиши, на которой есть đž. поэтому для обычных пользователей маловероятно, что они будут использовать предложенный вами вариант с одной буквой.   -  person SYOB SYOT    schedule 20.12.2016
comment
хорваты читают их как одну букву, но пишут отдельно. поскольку на клавиатуре нет этих клавиш, пользователям придется копировать и вставлять эти буквы, если они хотят их использовать. но я думаю даже если это кто-то и сделает, это не важно, так как большинство пользователей этого делать не будут. они будут вводить l и j отдельно, а также n и j, đ и ž. плюс мой проект не рассчитан на большое количество пользователей. это просто простое серверное приложение для моего колледжа. никто, вероятно, не будет использовать для них отдельные буквы. даже если это так, ничего страшного, если в конечном итоге это не работает.   -  person SYOB SYOT    schedule 20.12.2016
comment
но в любом случае, спасибо, что упомянули об этом мне. я буду помнить в случае, если мне это понадобится в любое время в будущем.   -  person SYOB SYOT    schedule 20.12.2016


Ответы (2)


Вы используете Collator для этого. Сопоставители — это способ Java для обработки интернационализированных сравнений.

List<String> mylist = ...;
Locale croatian = new Locale("hr", "HR");
// Put whatever Locale you need as the argument to the getInstance method.
Collator collator = Collator.getInstance(croatian);
Collections.sort(mylist, collator);

Местное — это не только «язык», но и множество других условностей. Один и тот же язык может быть отсортирован по-разному в зависимости от страны, региона или соглашения внутри страны, поэтому локаль идентифицируется не более чем тремя частями: «страна», «регион» и «вариант».

person Erwin Bolwidt    schedule 19.12.2016
comment
@Андреас хороший - person Erwin Bolwidt; 19.12.2016
comment
привет Эрвин. Что ж, большое спасибо за ваш пример и Андреасу за предоставленный образец класса. я новее, прежде чем слышал для подборщика. Я прошел курс Java, но мы никогда не говорили о таких вещах. мы изучили только пузырьковую сортировку, а после этого нам сказали, что в java есть методы в нескольких классах, которые можно использовать для сортировки вещей. мы говорили в общей сложности 10 минут о сортировке в этом курсе, а более новые рассматривали такие вещи, как сортировка с неанглийскими алфавитами. - person SYOB SYOT; 19.12.2016
comment
хотя я проходил курс java на хорватском языке, учитель избегал использования хорватских букв, и все задания, которые мы выполняли, были либо на английском, либо на хорватском языке, но все хорватские буквы были заменены наиболее близкими английскими вариантами. поэтому мне никогда не приходилось сортировать нестандартные буквы, такие как šđđćžč, до сих пор. в любом случае, спасибо за ответ, он действительно помог. вы только что сэкономили мне 2 дня программирования. потому что мой метод, единственный, который я мог представить, потребует не менее 4096 строк кода. в любом случае, спасибо. - person SYOB SYOT; 19.12.2016

Концепция называется сопоставлением. Вы можете посмотреть концепцию, чтобы узнать о ней больше. Например, у Oracle/Sun есть учебник по этой концепции:

https://docs.oracle.com/javase/tutorial/i18n/text/rule.html

person leeyuiwah    schedule 19.12.2016
comment
К вашему сведению, ответы, состоящие только из ссылки, не рекомендуются для StackOverflow (потому что ссылка может сломаться, и тогда ваш ответ будет бесполезен). Это было бы лучше в качестве комментария. - person ajb; 19.12.2016