もう一人のY君

iPhoneアプリのレビューやアップデートレビューなどを書いています. たまに数学の記事も書きます.

もう一人のY君 MENU  MENU

【iPhoneショートカット】重複する数を取り除く

f:id:thetheorier:20220203170130p:plain

 例えば1,2,2,3,4という列があったとき、重複している"2"を1つだけにして1,2,3,4とする…ということを考えます.

 

 

ショートカット

ショートカット

  • Apple
  • 仕事効率化
  • 無料

※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.

 レビュー時のiOSバージョン : iOS15.3

 

 

スポンサーリンク

 


 

 

 

「辞書」アクションの性質を利用する

 ショートカットアプリの「辞書」アクションが持つ性質を使います.

 

 

f:id:thetheorier:20220203170201p:plain

 まずは「辞書」アクションの性質を簡単に説明します.

 「辞書」アクションはキーとそれに対応する値の組によって構成され、JSONと一対一に対応します.

 

 

f:id:thetheorier:20220203170337p:plain

 この状態で「辞書の値を設定」アクションを使って同一のキーに別の値を設定すると、結果は上書きされます.

 画像のように、最初はキー「a」の値が「123」であったのが「456」に置き換わっています.

 

 

f:id:thetheorier:20220203170601p:plain

 また同じ辞書に対して「辞書の値を設定」で別のキーと値を設定すると、それが追加された状態になります.

 画像ではキー「a」の組に加えてキー「b」の組が追加されています.

 

 但し注意しなければならないのは、これはあくまでも「辞書の値を設定」による出力であり、辞書自信がこのように更新されたわけではありません.

 この結果を利用するにはこの出力をマジック変数で運用するか、これに続いて「変数を設定」で好きな名前の変数を使って上書きすることが必要です.

 

 

重複する値を擬似的に処理

 上で説明した「辞書の値を設定」をまとめると以下となります.

 

  • 同一の「キー」を使うとその組によって上書きされる
  • その時点で存在しないキーによる組を使うとその組が追加される

 

 加えて変数では「空の辞書」を代入することも可能です.

 

 これらの性質を使い以下を行います.

 

  1. 空の辞書を用意
  2. 対象の数列をキーとして「辞書の値を設定」で追加する(値は空にできない仕様のため適当なモノを入れる)
    (同一キーが無い場合)
    対象の数をキーとする組が新規追加
    (同一キーがある場合)
    すでにある対象の数をキーとする組と同一のものが今回の組で上書き
  3. 2のキーは重複のない数の列になる

 

 

レシピ

f:id:thetheorier:20220203175228p:plain

 というわけで具体的にレシピを組んでみます.

 はじめに空の状態の「辞書」をおき、それを変数(今回は"dict")におきます.

 ちなみに「辞書」をおかず「変数を設定」で「入力」を空のままにしても同じことができますが、その変数を使うごとに属性を「辞書」に書き換える手間が生じます.

 なお、一通り組んだらこの2つのアクションを削除しても機能するようになります.

 

 続いてメインとなる数の列を「テキスト」アクションでもよいので与えておきます.

 今回は画像のような10個の数で、4・5個目が484で重複しています.

 

 

f:id:thetheorier:20220203175745p:plain

 与えられた数データに対して「各項目を繰り返す」で処理していきます.

 但し今回は「テキスト」アクションに書いたため、繰り返しの対象は「テキストを分割」で分割したものになります.

 

 繰り返しの中で辞書dictに対して「キー」を「繰り返し項目」、値を適当な文字列にして「辞書の値を設定」で加え、これを「変数に設定」で上書きします.

 

 

f:id:thetheorier:20220203180038p:plain

 あとは得られた辞書dictのキーを参照するだけです.

 レシピでは念の為キーの項目数も計算し、キーは「ファイルにフィルタを適用」で昇順にしてから表示させます.

 

 

f:id:thetheorier:20220203180311p:plain

 実行すると、重複の分が正しく減っているのがわかります.

 

 

 重複を削除するアイデアとしては、他にも例えばif文を介して追加済みのリストの中身を逐次比較し、リストに無ければ追加、リストにあればスルー…といった方法もあります.

 しかしこの方法だと項目数が増えるごとにチェックする数がO(N^2)より小さいものの今回の方法でのオーダーO(N)より大きくどんどん時間がかかってしまいます.

 

 また当然この方法にもデメリットがあります.

 ショートカットならではなんですが、データを「辞書」アクションに格納したことで、順番が滅茶苦茶になってしまうことです.

 元の順番と確実に変わってしまうため、順番を維持したままこの方法で取り除くことはできません.

 よって別の方法を取る必要があります.

 それはまた次回紹介することにします.