2016-12-19 2 views
2

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

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

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

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

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

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

позволяет сказать, что есть определенная страна под названием «а», алфавит выглядит следующим образом:

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

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

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

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

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

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

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

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

хорошо, я дал те примеры, которые состоит из 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 строк кода, просто для сортировки глупых строк. У меня есть метод для сортировки английских строк, и он занимает всего несколько десятков строк кода. Надеюсь, кто-то может предложить мне что-то менее 4k строк кода.

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

thanx.

+0

Не указаны слова "đž", "lj" и "nj" на Хорватии? Они находятся в этой статье в Википедии: [https://en.wikipedia.org/wiki/Gaj%27s_Latin_alphabet](https://en.wikipedia.org/wiki/Gaj%27s_Latin_alphabet#Digraphs). Возможно, вам придется обрабатывать оба варианта, но я думаю, что вы найдете dž, lj и nj лучше работать с «Locale», чем с неграфовыми (неправильными?) Версиями. –

+0

hay, да, это правильно. это то, что усложняет сортировку. так как, например, «l» - это одна буква «j» - другая, но когда она одна за другой, они считаются третьей буквой. Я упомянул об этом в своем вопросе. , но в любом случае ответ ниже работает хорошо, и он правильно сортирует письма, поэтому мне больше не нужно беспокоиться об этом. –

+1

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

ответ

3

Вы используете Collator для этого. Collators - способ 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); 

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

+2

Доказательство/пример: [IDEONE] (https://ideone.com/4FQ3ZS) – Andreas

+0

@Andreas nice one –

+0

привет Erwin. хорошо, большое вам спасибо за ваш пример, и Андреасу за предоставление образца класса. i более новый, прежде чем услышать «collator». Я взял курс java, но мы никогда не говорили об этом. мы узнали только «тип пузыря», и после этого нам сказали, что java имеет методы в нескольких классах, которые можно использовать для сортировки вещей. мы говорили всего за 10 минут о сортировке в этом курсе, а новые рассматривали такие вещи, как сортировка с не английскими алфавитами. –

2

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

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

+0

FYI, ответы, состоящие только из ссылки, обескуражены StackOverflow (потому что ссылка может сломаться, а затем ваш ответ будет бесполезным). Это было бы лучше как комментарий. – ajb

+1

Спасибо! Я обновил свой ответ выше. – leeyuiwah

Смежные вопросы