ただのつぶやき

FMSに関する情報を発信していこうかなと思います。

第8問 ソートの話

ファイルを探す時に便利なのがソート機能。

れいに整理してくれるので目的のファイルを探しやすくなる。

ソートの仕方はいくつかあり、ファイルの名前順や最終更新日時など色々ある。

今回はファイル名順で並び替えるときについてどの順序になるのか細かく考える。

 

整数のソート

例えば、次のような方法で10個の整数を整列させてみる。

今回行うのはバブルソート

詳しくはここでは説明はしないので、各自調べてほしい。

何でバブルソートなのと思うかもしれないけど、白羽の矢が立っただけと思ってくれればいい。

以下のコードを使ってProcessingで動かしてみる。

f:id:quohHapSnow0320:20170324040251p:plain

(図1 コード)

コンソールの出力結果を見ると

[0] 51
[1] 29
[2] 16
[3] 66
[4] 18
[5] 46
[6] 31
[7] 12
[8] 6
[9] 1
-------
[0] 66
[1] 51
[2] 46
[3] 31
[4] 29
[5] 18
[6] 16
[7] 12
[8] 6
[9] 1

となった。

確かに数字が大きい順に並べられた。

これはもちろん予想通りだ。

じゃあ次。

 

文字列のソート

では、「あ」や「プ」、「猫」などといった文字列はどうなるのだろうか?

ソート方法としては、図1の9行目のif文の条件をword[i].compareTo(word[i+1])>=0に変える。

 

まずはひらがなの比較だ。

あ は お を な さ つ る ん め

と定められた文字列の配列10個を先ほどと同様にバブルソートで並び替えると、

あ お さ つ な は め る を ん

となった。

これは明らかに50音順のように思える。

 

では次に、濁音、半濁音、小文字を含んだ場合どうなるか?

ぱ は っ ば わ ぁ つ づ ゐ あ

を今までと同様にバブルソートで並び替えると、

ぁ あ っ つ づ は ば ぱ わ ゐ

となった。

どうやら同じ文字では、優先度としては小文字>大文字>濁音>半濁音の順のようだ。

 

カタカナにも同じことが言えるみたいだ。

パ ハ ッ バ ン ァ ツ ワ ヅ ア

ァ ア ッ ツ ヅ ハ バ パ ワ ン

と言う結果になった。

 

では、ひらがな、カタカナ、漢字が混じってしまった場合はどうだろう?

刃 ハ パ ば バ 葉 ぁ ァ あ 亜

ぁ あ ば ァ ハ バ パ 亜 刃 葉

という結果になった。

 

優先度としてはひらがな>カタカナ>漢字の順みたいだ。

同じ「は」と読む漢字でも優先度は「刃」>「葉」のようだ。

これは、もしかすると辞書順かもしれない。

手元にあった新明解国語辞典第7版の「は」のページを開いてみると、確かに「刃」の次に「葉」が来ていた。

 

 

試しに以下の方もやってみた。

下 化 火 加 可 仮 何 花 価 佳

下 仮 何 佳 価 加 化 可 火 花

 

 

…あれ?これ違うぞ…?

 

 

元の配列は、新明解国語辞典では順番通りになっているはずだ。

なのに、ソートすると順番が入れ替わってしまった。

 

 

なんでだろう?

 

 

色々調べてたら、上の順番にあてはまりそうなのが見つかった。

それはShift-JISUnicodeだ。

WindowsではShift-JISというものが使われているらしく、ファイル名をソートするときは、これが基準になるみたいだ。

以下の画像がShift-JISにおける先ほどの配列の漢字の順番だ。

f:id:quohHapSnow0320:20170324030156p:plain

(図2 Shift-JIS表)

これは、先ほどのソート結果とは異なる。

試しに、Windowsでソートしてみると、

f:id:quohHapSnow0320:20170324041425p:plain

(図3 テキストファイル名で試した)

確かに、図2の通りの順番になった。

 

ではUnicodeはどうだろう?

Java内部つまり、Processing内部ではUnicodeが使われているようだ。

探すのが大変だったが、正しいか確かめるため一つ一つ検索してみた。

下:4E0B

仮:4EEE

何:4F55

佳:4F73

価:4FA1

加:52A0

化:5316

可:53EF

火:706B

花:82B1

という検索結果が得られた。

確かに、先ほどのソート結果はUnicodeにおける順番に相当することがわかった。

 

漢字は確かであることが分かった。

では、先ほどまで確定していたのひらがなやカタカナの優先順序はどうなのだろうか?

Unicode表を確認してすると、先ほどの順序で間違いは無いようだ。

つまり、

ひらがな(50音順)>カタカナ(50音順)>漢字

であり、

小文字>大文字>濁音>半濁音

であるということだ。

 

そういえば、調べてて見つけたのだが、

数値的な大小つまり、

"1"<"2"<"11"<"12"<"112"

という大小関係のことを位取式順序といい、

辞書で出てくる順番のように、

"1"<"11"<"112"<"12"<"2"

という大小関係のことを辞書式順序というらしい。(ものすごくどうでもいい)

 

じゃあ最後に。

半角数字、半角英字、全角数字、全角英字、ひらがな、半角カタカナ、カタカナ、漢字の優先順序はどうなっているだろうか?

 

Unicode表一覧を見てみると、

半角数字(0030~0039)>半角英大字(0041~005A)>半角英小字(0061~007A)>ひらがな(3041~3096)>カタカナ(30A1~30FA)>漢字(4E00~9FCC)>全角数字(FF10~FF19)>全角英大字(FF21~FF2A)>全角英小字(FF41~FF5A)>半角カタカナ(FF66~FF9C)

みたいだ。

 

実際にソートさせてみると、

プ サ 2 1 b 猫 あ c A P

1 A b あ プ 猫 2 P c サ

確かに、上の順番だったようだ。

 

 

ある程度満足したところで、ここで終わり。

それでは。

 

参考

Unicode一覧 0000-0FFF - Wikipedia

《Unicode/CJK統合漢字》漢字検索

Processingでバブルソート - matablo