2016-12-19 15 views
2

私は答えを探しましたが、標準アルファベットには適しています。しかし、私はそれ以外の状況があります。英語以外の文字列を並べ替える方法は?

私はjavaでプログラミングしています。私は特定のプログラムを書いています。このプログラムはいくつかの場所で文字列項目のリストを持っています。 アルファベットに従ってこれらの文字列アイテムをソートしたいと思います。

英語のアルファベットでソートすると、すべてのコードページが情報交換用のアメリカ標準コード(ascii)と互換性があり、すべての英字が既にソートされているため、簡単です。私のリストを並べ替えることを望むなら、文字の値を比較して、どの文字がどこに行くのかを判断するだけでよいでしょう。

しかし、私の問題は、英語のアルファベットを使用してリストを並べ替えることはしたくないということです。 私のプログラムには、英語またはその他の言語で表示するオプションがあります。 問題は、これらの言語の中に英語アルファベットとは異なるアルファベットがあるため、アルファベットのアルファベットと同じではないため、単純な<と>文字の値の検証は機能しません。コードページ。の

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

最初:

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

は、アルファベット、このように書き、「ABC」という名前の特定の国があると言うことができます:この質問の目的のために

は、次のように英語のアルファベットがあると言うことができますコードページの97に等しいならば、この例では、2番目のアルファベットは最初の文字が100に等しく、2番目のアルファベットは98に等しく、3番目のアルファベットは98になります。 103などに?

と私の2番目の質問: 残念ながら、私のプログラムを翻訳している国の中にはアルファベットがあり、文字の組み合わせによっては1文字として扱われます。

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

: - アルファベットの最初の文字、 グラム - アルファベットの第二の手紙、 が可能 - 3番目の文字 D私の第二の例について は、その国が「DEF」以下のアルファベットを持って言うことができますアルファベットでは e-第4文字、 アルファベットで第5文字(アルファベットでは1文字、2文字で書かれていますが、アルファベットでは1文字と見なされます) (2文字で書かれていますが、1文字として扱われます)、 アルファベットのc - 6番目の文字、アルファベットの f - 7番目の文字。

この想像上の例で想像しているように、想像上の国「def」の2番目にあるように、この国は本当にアルファベットを台無しにしています。 2つの想像上の国の2つのアルファベットのこれら2つの例を提示した後、私は文字列をソートするための標準的な方法を使用できない理由を理解しています。

このソートで私を助けてください。私はこのねじれたアルファベットに従ってソートするために何ができるのか分かりません。

ポスト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|ž 

、およびいくつかのそれらのうちのいくつかは英字ではなく、いくつかの文字は2文字で書かれた1文字です。ソートするのがとても難しいです。だから私は誰かがそれをやる方法を知っていることを願っています。 もちろん、ソートのための最も愚かな方法があります。これは、常に動作し、何かをソートすることができます。switch文を使用する方法です.2つの文字列項目を比較し、デフォルト= 32件、それぞれ32件の独自のスイッチがあります。合計1024ケースで、平均ケースに4行のコードがある場合、英語以外のアルファベットを使用して文字列をソートすると、ソート方法は少なくとも4096行になります。 これは大きな方法です。 これは並べ替えの愚かな方法ですが、現時点では1つしかわかりません。 私は誰かがこれを行うための簡単な方法を知って欲しいので、私はここで尋ねています。メソッドは、ちょうど愚かな文字列をソートするためにコードの4k行ほど大きくはありません。 私は英語の文字列をソートする方法を持っており、10行以上のコードしか必要としません。 誰かが私に4k行未満のコードを提案できることを願っています。

誰かが簡単な解決策を知っていれば、私はそれを感謝します。

thanx。

+0

クロアチア語で "đž"、 "lj"、 "nj"の単一の文字はありませんか?彼らはこのウィキペディアの記事[https://en.wikipedia.org/wiki/Gaj%27s_Latin_alphabet](https://en.wikipedia.org/wiki/Gaj%27s_Latin_alphabet#Digraphs)にあります。おそらくあなたは両方のバリアントを扱う必要があるでしょうが、 '' Locale'ではdž、lj、njが非字句(間違った?)バージョンよりもうまく機能することがわかります。 –

+0

干し草、 はい、それは正しいです。これはソートをより困難にするものです。例えば ​​"l"は一文字 "j"であるから、別のものであるが、それらが互いにあるときには三番目の文字とみなされる。私は私の質問でこれを言及した。 とにかく、以下の答えはうまく動作し、正しく文字を並べ替えるので、これ以上心配する必要はありません。 –

+1

良い私の指摘は、有向グラフのための単一の文字があるということです。私の前のコメントの最後の文から1つをコピーしてみてください。 –

答えて

3

あなたはそのためのCollatorを使用しています。 Collat​​orは、国際化された比較を処理する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

こんにちはアーウィン。サンプルを提供してくれたAndreasに感謝します。 "collat​​or"について聞いたことがあります。私はjavaコースを取ったが、私たちはこのようなことについて決して話したことはなかった。 私たちは「バブルソート」だけを学びました。その後、javaにはいくつかのクラスのメソッドがあり、ソートに使うことができます。 私たちは、そのコースでソートすることについて合計で10分のように話していました。そして、英語以外のアルファベットで並べ替えるような新しいものも考えました。 –

2

この概念は照合と呼ばれます。あなたはそれについてもっと知るための概念を調べることができます。たとえば、Oracle/Sunは、この概念についてのチュートリアルがあります。

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

+0

FYI、リンクのみで構成されている回答は、StackOverflowが推奨されません(リンクが途切れる可能性があり、答えが役に立たないためです)。これはコメントとしては良いでしょう。 – ajb

+1

ありがとう!私は上記の私の答えを更新しました。 – leeyuiwah

関連する問題