自然順

辞書順と数字の大きさ順を組み合わせた,人間に優しい並び換え順序

自然順(自然な並び換え順序、: Natural sort order)とは、文字列の照合規則の一つであり, 辞書式順序を基本としつつも複数桁の数字をまとめて1つの数値として扱う。 一般に計算機による文字列の並び換えは辞書式順序が主であるが,自然順による並びは人間にとってより直感的であり,とくに末端利用者向けのUIとして推奨されている[1]

編集

例として、文字列“foo11”と“foo2”の照合について考える。

辞書順
先頭から比較する。“foo”は共通。次に“1”と“2”を比較する。“1”は“2”よりも辞書的に前にあるので,“foo11”は“foo2”より小さいと看做される。
  1. foo11
  2. foo2
自然順
“foo”の照合までは辞書順と同じである。次に比較されるのは数値としての“11”および“2”である。“11”は“2”よりも数値的に後にあるので,“foo11”は“foo2”より大きいと看做される。
  1. foo2
  2. foo11

自然順の並び換えを提供する主な言語・ライブラリ 編集

プログラミング言語には,自然順による並び換え機能が組み込まれているものもある。 また,組み込みで存在していなくとも,多くの場合は自然順による並び換え機能を提供するライブラリが存在する。

以下に,いくつかプログラミング言語において文字列を自然順に並び換えている例を挙げる。 なお,標準(または規格)として自然順照合が提供されているものにかんしては,言語・ライブラリ名の先頭に赤星(*)を附加した。

*Win32 API
Windows XPおよびWindows Server 2003以降のWin32 APIではStrCmpLogicalW()関数が利用できる[2]
Add-Type -Name 'NaturalStringComparerNative' -MemberDefinition @'
  [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
  public static extern int
  StrCmpLogicalW(string psz1, string psz2);
'@

$narr =
  [Collections.Generic.List[string]]`
  ('z100a', 'z120', 'z121', 'z02a', 'z3', 'z4', 'z100', 'z02000', 'z01', 'z02', 'z05')

$narr.
 Sort({
   [Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes.NaturalStringComparerNative]::
   StrCmpLogicalW($args[0], $args[1])
  })

"$narr"
Perl(モジュール)
Perl 5ではSort::Naturallyモジュールが提供するnsort()関数を用いて配列の各要素を自然順に照合できる[3]
use Sort::Naturally;

@narr = qw(test01.txt test1.txt test10.txt test3.txt);

@narr = nsort(@narr);

print join(' ', @narr);
*PHP
PHP 4、PHP 5、PHP 7ではnatsort()関数を用いて配列の各要素を自然順に照合できる[4]
<?php
$narr = array("test01.txt", "test1.txt", "test10.txt", "test3.txt");

natsort($narr);

print_r($narr);
?>
Python(パッケージ)
Python 2、Python 3ではnatsortパッケージを利用して自然順の照合ができる[5]
from natsort import natsorted

narr = ['test01.txt', 'test1.txt', 'test10.txt', 'test3.txt']

natsorted(narr)

print(narr)

脚注 編集

出典 編集

参考文献 編集

実装

関連項目 編集

外部リンク 編集

  • Online Alphabetizer Tool - オンラインで種々の照合規則を実行できるWebサービス。「Sort Natural」ボタンが自然順、「Sort Alphabetically」ボタンが(自然順が数字以外の照合の際に基本とする)アルファベット順の並び換え。