今回は外部, つまり「ファイル」アプリやDropbox, Bearメモなどのサービスから読み込んだ辞書形式のテキストを取り込んだときの数のキー列を昇順または降順にすることを考えます.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS14.3
スポンサーリンク
内部辞書は問題ないけど…
前置きが長いです, 本題はつぎの見出しになります.
まずレシピ内で辞書を追加した場合を考えます.
例えば画像のように1から11までの連続した数をキーとした, (今回はキーが重要なので)適当な値が入った辞書を作り, すべてのキーを取得してこれを表示します.
この場合は辞書に追加した順番になっているのがわかります.
次に画像のようなplist形式の辞書を「ファイル」アプリに保存し, これを読み込んで辞書として同じことをします.
順を追って変化を見てます.
まずあらかじめ上記のテキストを「ファイル」アプリに保存しておき, 「ファイルを取得」で取り込んでまずこれを表示して確かめます.
続いて前後に適切なテキストを追加することで辞書として取り込めるようにします.
そしてこの辞書からすべてのキーを取得して表示します.
単純に辞書にしただけですから取得したキーの列は同じ順になっているはずです.
念の為, 上記のキー列に対してフィルタをかけます.
「ファイルにフィルタを適用」アクションを追加し,
- フィルタ → なし
- 並び順序 → 名前
- 順序 → アルファベット昇順
- 制限 → オフ
としてこの結果を表示させます.
まず「ファイル」から取り込んだ時点での生データです.
当然並びは元のままです.
続いて上記を辞書化してすべてのキーを取得したものです.
もうこの時点で順番が滅茶苦茶です.
なのでこのままだと「リストから選択」はこの滅茶苦茶な順になってしまいますし, あるいは「各項目を繰り返す」の「繰り返しインデックス」はこの順に従ってしまいます.
順番が変わっても問題ない処理であれば気にせず済みますがそうでない時はたまったもんじゃありません.
そもそもこれはバグなんでしょうかね…
ではここから「名前」「昇順」でフィルタをかけた結果は…というと画像のとおりです.
昇順は昇順なのですがどうやら文字の先頭から文字を評価しているようで, 本来なら1,2,3,4,…,8,9,10,11となるはずが1,10,11,2,3,4,…,8,9となってしまっています.
これじゃ使い物になりません.
数列をソートする
ではどうすればよいか…と試行錯誤した結果, ベストとは言いませんがベターな方法として以下を考えました.
まず対象のキーに含まれる各々の数は, 画像のように最大桁数に合わせてそれより小さい数は先頭に0を付けます.
そしてそのテキストファイルを読み込んでplist化→辞書化→すべてのキーを取得…までは前回とまったく同じです.
ここからが変わります.
先程と同じく「ファイルにフィルタを適用」アクションを追加するのですが, 「ファイル」の箇所をタップし,
- 辞書の値 → テキストとして
- 入手 → 名前
に変更します(フィルタや並び順序などは前回と同じ).
これによってキーの並び順については正しく行われます.
ただし上記でフィルタをかけた時点ではただ並び順を変えただけです.
なので例えば01としたキーはまだ01のままです.
そこで実際に扱う時にはフィルタの時と同様, 変数の部分をタップして今度は
- ファイル → 数字として
- 入手 → 名前
に変更します.
対象がテキストから数字になったことで, 例えば01が1に変わってくれます.
上記は「リストから選択」の場合でしたが変数に代入するときも同じです.
もちろん変数に代入せずともフィルタをかけた結果を利用する箇所で同じ変更を行えば良いことになります.
これで外部から読み込んだ数列をソートしてプロットできるようになりました.
変数に代入した場合ももちろん大丈夫です.
〆
こうしてソートできるにはできるのですがどうしてもデメリットがあって, 少なくとも
- 先頭に0を付ける操作が煩わしい
- 数字以外のキーと混在する場合に使えない(値を「数字として」にする操作が使えないため)
という点があります.
「ファイルを取り込んでからキー先頭に0を適当に5個10個追加したら良いんじゃないか?」と思って実際に行ったんですが, 結果はダメでした.
正規表現を使って桁数を均してもいいんでしょうが, 項目数が増えるとその処理に時間がかかるため現実的ではありません(少ないなら採用するのもアリです).
理屈で言えば内部で追加した辞書でも行えるわけですが, 今度は先頭に0をつける処理が面倒…というか今の所アイデアが思いつきません.
フィルタの仕様さえまともならそれで完結する問題なんですけどね.