アプリケーション開発をしていると値を比較することは頻繁にあるかと思います。単純に2つの値を比較するだけなら簡単なのですが、この値の片方、または双方がリスト値となった場合は少し複雑です。
そこで、リスト値の判定に関してまとめます。調査する比較方法は次の4種類です。主題は ① と ② の演算子なのですが、参考までに ③ と ④ の@関数も比較してみます。
① | A = B | 並列演算による比較 |
② | A *= B | 順列演算による比較 |
③ | @IsMember(A; B) | A が B に含まれるか判定 |
④ | @Contains(B; A) | A が B に含まれるか判定(部分一致含む) 引数の順に注意してください |
テスト I
まずは、基本的なテストです。
B の値を固定して、調べる値である A を変化させた場合を確認します。A の値は、完全に一致と一致する要素が含まれるかどうかで変化させました。
@IsMember は A のすべてが B に含まれている必要があることがわかります。それ以外の比較では、一致するものが1つでもあれば True となっています。
A | B | A = B | A *= B | @IsMember (A; B) |
@Contains (B; A) |
|
1 | abc def ghi |
abc def ghi |
True | True | True | True |
2 | abc | abc def ghi |
True | True | True | True |
3 | abc xyz |
abc def ghi |
True | True | True | |
4 | xyz | abc def ghi |
※ 空白の欄は False
テスト II
テスト I と同様のテストですが、A と B の値を逆転させた場合です。
一致するものが1つでもあれば True であることが確認でき、テスト I と同様の結果です。
A | B | A = B | A *= B | @IsMember (A; B) |
@Contains (B; A) |
|
1 | abc def ghi |
abc | True | True | True | |
2 | abc def ghi |
abc xyz |
True | True | True | |
3 | abc def ghi |
xyz |
テスト III
リストにぬけがある場合です。
並列演算である A = B が True となるんですね。意外な結果ですので、この点は注意が必要です。
@IsMember は、すべての要素が一致する必要があるので、III-1 のテストは False となります。
A | B | A = B | A *= B | @IsMember (A; B) |
@Contains (B; A) |
|
1 | abc def ghi |
abc ghi |
True | True | True | |
2 | abc ghi |
abc def ghi |
True | True | True | True |
テスト IV
次はリスト値の順序の確認です。要素の出現順を入れ替えた場合です。順列演算の場合は、True と判定されています。
一致しない要素を入れてみましたが、特別な結果はありませんでしたね。
A | B | A = B | A *= B | @IsMember (A; B) |
@Contains (B; A) |
|
1 | abc def ghi |
ghi abc |
True | True | ||
2 | abc def ghi |
ghi abc xyz |
True | True | ||
3 | ghi abc |
abc def ghi |
True | True | True | |
4 | ghi abc xyz |
abc def ghi |
True | True |
テスト V
部分一致のテストです。@Contains 以外は部分一致では反応しませんでした。
A | B | A = B | A *= B | @IsMember (A; B) |
@Contains (B; A) |
|
1 | ab | abc def ghi |
True | |||
2 | hi xy |
abc def ghi |
True | |||
3 | xy | abc def ghi |
テスト VI
参考までに null の場合やリスト値でない場合の結果もまとめておきます。
調べる値 A が null の場合、@IsMember と @Contains で差がある点に注意が必要ですね。
A | B | A = B | A *= B | @IsMember (A; B) |
@Contains (B; A) |
|
1 | (null) | (null) | True | True | True | True |
2 | abc | (null) | ||||
3 | (null) | abc | True | |||
4 | abc | abc | True | True | True | True |
5 | ab | abc | True | |||
6 | xy | abc | ||||
7 | abc | ab | ||||
8 | abc | xy |
まとめ
値の比較とリスト値の関係をまとめました。これらの挙動を理解した上で、バグを出さないよう注意して開発しましょう。
また、プログラム内で使用されている = 演算子がリスト値まで意識しているのか判断に困ることがたまにあります。特に別の開発者が作成したアプリの場合、特にそうですよね。こういった場合に備え、@IsMember などの関数を積極的に使用したほうがリストを意識したことが明示的となり、わかりやすいかもしれませんね。
0 件のコメント:
コメントを投稿