2023/10/31

リスト値の判定

アプリケーション開発をしていると値を比較することは頻繁にあるかと思います。単純に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 件のコメント:

コメントを投稿