この記事で扱っていること
- 指定したクラスタ要素を基準にソートする方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
プログラムの中で、数の大小順あるいはアルファベット順等で並び替えをする、いわゆるソートの機能は様々な場面で使用されます。
単に数値だけ、や文字列だけ、を扱っている配列であれば関数一つで並び替えができるのですが、「クラスタの配列」になっていてクラスタの特定の要素を基準にソートするとなると関数一つでは対応できません。
本記事では、そんなクラスタの要素を基準にソートする方法について、なるべく汎用的に使用できる方法も含めて紹介しています。
どんな結果になるか
例えば、以下のような2つの要素を持つクラスタ配列を考えます。
もしこの配列にそのままソートの関数を使用した場合には自動的に「クラスタの順序」の最初である数値(ラベル名「num」)を基準にソートされます。
そうではなく、文字列の方でアルファベット順に並ぶようにソートをかけることができます。
別の例で、3つの要素を持っていたとして、それぞれでソートをかけることもできます。
プログラムの構造
クラスタごとにソートしたい項目をバンドル解除し、その項目だけの配列にしてソートをかけてから、元々のクラスタの順番を入れ替える処理をします。
クラスタの中の要素数が変わっても理屈は同じですね。
より汎用的に使用できるプログラム
上で紹介したプログラムでもクラスタ内の任意の要素を基準にソートすることはできるのですが、頻繁に同じ操作を行う場合にはあちこちに似たような操作が発生します。
バンドル解除する項目を、要素の名前で自動的に識別させるようなプログラムの方がより汎用的に使えるので、例えばクラスタの中のソートしたいラベル名とその項目のデータタイプを指定してソートをかけるというプログラムを考えます。
実行時のイメージは以下の図のような感じです。
クラスタの要素のラベル名を「ソート対象ラベル名」に指定し、その要素のデータタイプを指定した状態でプログラムを実行することで、そのラベルを持つ要素を基準にしたソートをかけています。
このソート処理を行う部分をサブVI化してしまえば、このようなソートを繰り返すようなプログラムではラベル名とデータタイプの指定だけで対象のクラスタソートを実装しやすくなります。
サブVIの中身は以下の通りで、VIのフロントパネルのリファレンスを取得し、フロントパネル上の制御器のリファレンスから、クラスタの中身のリファレンスを取得してやり、その中身のデータ(バリアントとして取得される)でソートをかけるという方法です。
ただし、この方法は、クラスタ要素の中にクラスタが入っているような、入れ子状のデータに対しては期待した結果になりません。
(そのような複雑な要素を持つクラスタに対してソートをかけることは稀だと思うので特に考慮しなくていいかなと考えています)
本記事では、指定したクラスタ要素を基準にソートする方法を紹介しました。
大きなプログラムほど、データの種類を一つのクラスタにまとめ、そのようなクラスタを配列として扱う場面も多く出てくると思います。
要素ごとに異なるソートを掛けたいときに参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント