今回は数字のソート, 並び替えの話です.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS15.0.1
スポンサーリンク
フィルタでは不十分
ショートカットにある「ファイルにフィルタを適用」アクションに並び替えの項目はあるのですが, 並び替えの仕様に問題があり, 数字に並び替えに適さない問題があります.
代わりになる単体のアクションもないため他の工夫が必要です.
今回は先頭を0埋めして一番大きい数の桁の文字列だけ末尾から切り取る方法を…と言いたいのですが, これが通用するのは対象が整数のみの場合です.
もし小数が一つでも存在するとこの方法は使えません.
なので0埋めはしますが, 桁合わせは最も大きい数の整数部分の桁数を基準に「先頭から」不要な0を取り除く方法でいきます.
レシピ
「ファイルにフィルタを適用」をシンプルに使った, ダメな例を含めてレシピを作っていきます.
「テキスト」アクションに並び替えたい数を入れておきます.
このままでは並び替えできないため「テキストを分割」で改行で分割し, これを使います.
まずはダメな例, これをそのまま「ファイルにフィルタを適用」で名前をアルファベット昇順に並び替えるケースです.
本来ならたったこれだけで並び替えできればいいんですが…
次に最も大きい数の整数部分の桁数を計算します.
列の最大値は「統計を計算」アクションを使って求めることができます.
これを使って「計算式」アクションで
floor(log(Maximum)+1)
を計算させることでリストの最大値の整数部分の桁数digitsが求まります.
次に数リストの0埋めを行います.
数リストに対して「各項目を繰り返す」アクションを適用し, 「テキスト」アクションに好きな数だけ0を並べ, その後ろに繰り返し項目を置きます.
次に「計算式」アクションで
x-[digits]+floor(log([繰り返し項目])+1)
を計算します.
ここでxは上の「テキスト」アクションで入れた0の個数にします.
この計算結果をもとに, 「テキストを置き換え」アクションで以下のようにします.
- 置き換え前("こんにちは"と灰色になっている部分) → .{計算結果}
- 置き換え後("世界"と灰色になっている部分) → 何も書かない
- 正規表現 → オン
正規表現における.(ドット)は任意の一文字にマッチします.
そして{n}は「n回繰り返す」という意味です.
例えば.{2}は「任意の2文字」にマッチします.
今回計算した結果は20個並べた0の数20から最大桁数を引き, 繰り返し項目の整数部分の桁数を足したものです.
今回与えた数のリストの最大値は10032で5桁なのでdigits=5, 例えば10032については20-5+5=20なので10032の場合は先頭に付けた0は結局全部取り払います.
また1001.66の場合は整数部分の桁数が4なので20-5+4=19、つまり先頭に付けた0の文字20個のうち先頭の19個取り払い、結果01001.66になります.
こうしてどの値も, 最大値の整数部分の桁数が揃うよう0が補われます.
0埋めに必要な0の数は, リストの最大値と最小値の桁数の差で決まるのは容易にわかります.
なので20個にしている理由は特にありません.
これで整数部分の桁数が揃ったのでフィルタをかけて問題ないはずです.
「ファイルにフィルタを適用」で上の繰り返しの結果を適用します.
因みに, フィルタをかけた時点ではテキストの扱いになっているためテキスト表示すれば当然埋めた0はそのまま表示されます.
この後ただ表示するにしても更に計算などに使うにしても, 数として扱う場合は対象をタップして「種類」が「数字」になっていることを確認してください.
実行結果
まずはリストを直接「ファイルにフィルタを適用」アクションにかけたものです.
このアクションは手前の一文字一文字を順にソートする仕様のため, 画像のように例えば10032が21の前になってしまっています.
0埋めをした場合はちゃんと正しい順番になっています.
〆
iOS15でこのフィルタソートも変わってくれないかと期待したのですが残念ながら変わらずでした.
「変数に設定」などの冗長なアクションを削ったとしても, 本来2アクションで済むのが8アクションに増えてしまっています.
データ数が少ないうちはいいんですが100個200個と増えるうちにかなり時間がかかるようになります.
いい加減ソートのオプションを増やしてほしいです.