[JavaScript] 自然言語アルゴリズムで配列をソート
JavaScript で自然順ソートを実装してみたい。自然順アルゴリズムの仕様がどこかに載ってないかな…。何となく、アルゴリズムは頭の中に出来ているのだけど、既に模範があるなら参考にしたい。
2010-11-03 02:27:22@think49 JavaScript では 'abc' < 'efg' は true となり、'3' < '10'; は false となる。なるほど…。
2010-11-03 02:34:54@think49 これ? →http://sourcefrog.net/projects/natsort/
2010-11-03 02:43:06@Yuichirou ありがとうございます。C言語を読めないといかんですね。(汗) でも、比較サンプルから形は見えてきました。
2010-11-03 02:56:091 < a === false だけど、'1'.charCodeAt(0) < 'a'.charCodeAt(0) === true となる。自然順ソートでは後者の挙動なので charCodeAt を使う必要がある。
2010-11-03 03:04:30PHP の natsort で検証してみる。 http://docs.php.net/manual/ja/function.natsort.php
2010-11-03 03:14:46$array = array("01", "1", "a1", "a01"); を natsort したところ、["01", "1", "a1", "a01"] を返してきた。同値と見なして良さそうだ。
2010-11-03 03:18:37natsort(['a1b', 'a1a', 'a', 'a2', 'a0', 'a20', 'a10', 'a1']); の結果が ["a", "a0", "a1", "a1b", "a1a", "a2", "a10", "a20"] となる。修正しなくては。
2010-11-03 04:28:24今度は natsort(['rfc1.txt', 'rfc2086.txt', 'rfc822.txt']); が ["rfc822.txt", "rfc2086.txt", "rfc1.txt"] を返すようになってしまった…。 ちょっと時間をおいた方がいいかな。
2010-11-03 04:57:08修正。natsort(['rfc1.txt', 'rfc2086.txt', 'rfc822.txt']); は ["rfc1.txt", "rfc822.txt", "rfc2086.txt"] を返すようになった。
2010-11-03 05:07:55natsort(['x2-y7', 'x2-g8', 'x8-y8', 'x2-y08']); は ["x2-g8", "x2-y7", "x2-y08", "x8-y8"] を返す。/ これは期待通りの動作。
2010-11-03 05:10:02natsort([ '1.3', '1.02', '1.002', '1.010', '1.1', '1.001']); は ["1.1", "1.001", "1.02", "1.002", "1.3", "1.010"] を返す。/ これは期待通りではない。
2010-11-03 05:13:06natsort([3, 2, 1]); のように配列の要素にString型以外の値が存在するとき TypeError を返す不具合を修正した。
2010-11-03 05:16:52修正。natsort([1.3, 1.02, 1.002, '1.010', 1.1, 1.001]); は [1.001, 1.002, "1.010", 1.02, 1.1, 1.3] を返すようになった。
2010-11-03 05:30:51natsort(['pic 4 else', 'pic4']); は ["pic 4 else", "pic4"] を返す。/ これは期待通りではない。空白文字は読み飛ばさなければならない。
2010-11-03 05:34:44修正。 natsort(['pic 4 else', 'pic4']); は ["pic4", "pic 4 else"] を返すようになった。
2010-11-03 05:39:12natsort([-5, -1, -3, -7]); は [-1, -3, -5, -7] を返す。/ 「Natural Order String Comparison」では特に明記されていないが、自然順アルゴリズムは負の数を考慮しないと思われる。
2010-11-03 05:44:52もし、負の数を考慮するのであれば http://goo.gl/Myx1N が 1-2, 1-02, 1-20 の配列となっているのはおかしい。 先頭の "1" は同値で -2, -02, -20 を比較するのだから、"1-20" が先頭に来なければならないはず。
2010-11-03 05:47:15natsort.js を修正。空白文字を読み飛ばさなかったケアレスミスと string.length を得るタイミングをトリミングする前にするようにした。
2010-11-03 23:18:50