$LISTSAME (ObjectScript)
構文
$LISTSAME(list1,list2)
$LS(list1,list2)
引数
引数 | 説明 |
---|---|
list1 | リストに評価する任意の式。リストは、$LISTBUILD または $LISTFROMSTRING を使用して作成されるか、$LIST を使用して別のリストから抽出されます。NULL 文字列 ("") も、有効なリストと見なされます。 |
list2 | リストに評価する任意の式。リストは、$LISTBUILD または $LISTFROMSTRING を使用して作成されるか、$LIST を使用して別のリストから抽出されます。NULL 文字列 ("") も、有効なリストと見なされます。 |
概要
$LISTSAME は、2 つのリストの内容を比較し、リストが同一の場合、1 を返します。リストが同一でない場合、$LISTSAME は 0 を返します。$LISTSAME は、リスト要素を、その文字列表現を使用して比較します。$LISTSAME 比較では大文字と小文字が区別されます。
$LISTSAME は 2 つのリストを要素ごとに左から右の順に比較します。したがって、$LISTSAME は最初に同一でないリスト要素のペアを検出すると 0 を返し、それ以降の要素が有効なリスト要素かどうかを判別するためのチェックは行いません。$LISTSAME 比較が無効な要素を検出した場合、<LIST> エラーが発行されます。
例
以下の例は、2 つのリストが同一であるため、1 を返します。
SET x = $LISTBUILD("Red","Blue","Green")
SET y = $LISTBUILD("Red","Blue","Green")
WRITE $LISTSAME(x,y)
以下の例は、2 つのリストが同一でないため、0 を返します。
SET x = $LISTBUILD("Red","Blue","Yellow")
SET y = $LISTBUILD("Red","Yellow","Blue")
WRITE $LISTSAME(x,y)
同一のリスト
$LISTSAME は、2 つのリストで文字列表現が同一である場合に、2 つのリストを同一と見なします。
数値と文字列のリスト要素を比較する際、文字列リスト要素では、数値をキャノニック形式で表す必要があります。これは、InterSystems IRIS では常に、比較の実行前に、数字がキャノニック形式に変換されるためです。以下の例で、$LISTSAME は文字列と数値を比較します。最初の 3 つの $LISTSAME 関数は 1 (同一) を返します。4 つ目の $LISTSAME 関数は 0 (同一でない) を返します。これは、文字列表現がキャノニック形式でないためです。
WRITE $LISTSAME($LISTBUILD("365"),$LISTBUILD(365)),!
WRITE $LISTSAME($LISTBUILD("365"),$LISTBUILD(365.0)),!
WRITE $LISTSAME($LISTBUILD("365.5"),$LISTBUILD(365.5)),!
WRITE $LISTSAME($LISTBUILD("365.0"),$LISTBUILD(365.0))
$LISTSAME 比較は、その他のリスト演算子で使用されるのと同じ等価テストではありません。他の演算子では、リストの内部表現を使用してテストします。以下の例で示すように、1 つの数字と 1 つの数値文字列を比較するとき、この相違が容易にわかります。
SET x = $LISTBUILD("365")
SET y = $LISTBUILD(365)
IF x=y
{ WRITE !,"Equal sign: number/numeric string identical" }
ELSE { WRITE !,"Equal sign: number/numeric string differ" }
IF 1=$LISTSAME(x,y)
{ WRITE !,"$LISTSAME: number/numeric string identical" }
ELSE { WRITE !,"$LISTSAME: number/numeric string differ" }
等価 (=) 比較は、これらのリスト (同一ではない) の内部表現をテストします。$LISTSAME は、両方のリストに対して文字列変換を実行し、これらを比較して、同一であると判断します。
以下の例は、数値要素のさまざまな表現を持つ 2 つのリストを示します。$LISTSAME は、これら 2 つのリストを同一と見なします。
SET x = $LISTBUILD("360","361","362","363","364","365","366")
SET y = $LISTBUILD(00360.000,(19*19),+"362",363,364.0,+365,"3"_"66")
WRITE !,$LISTSAME(x,y)," lists are identical"
最大数値
2**63 (9223372036854775810) を超える数または -2**63 (-9223372036854775808) 未満の数は、$LISTSAME リストの比較の最大数値範囲を超えています。以下の例のように、そのような大きな数字を比較すると、$LISTSAME は 0 を返します。
SET bignum=$LISTBUILD(9223372036854775810)
SET bigstr=$LISTBUILD("9223372036854775810")
WRITE $LISTSAME(bignum,bigstr),!
SET bignum=$LISTBUILD(9223372036854775811)
SET bigstr=$LISTBUILD("9223372036854775811")
WRITE $LISTSAME(bignum,bigstr)
NULL 文字列と NULL リスト
NULL 文字列 (空の文字列) を唯一の要素として含むリストは、有効なリストです。NULL 文字列自体も、有効なリストと見なされます。ただし、これら 2 つ (NULL 文字列と NULL リスト) は、以下の例で示すように、同一とは見なされません。
WRITE !,$LISTSAME($LISTBUILD(""),$LISTBUILD(""))," null lists"
WRITE !,$LISTSAME("","")," null strings"
WRITE !,$LISTSAME($LISTBUILD(""),"")," null list and null string"
通常、文字列は有効な $LISTSAME 引数ではないので、$LISTSAME は、<LIST> エラーを発行します。ただし、以下の $LISTSAME 比較は正常に終了し、0 (値は同一ではない) を返します。NULL 文字列と文字列 “abc” が比較され、同一ではないことが判明します。これらの NULL 文字列の比較により、<LIST> エラーは発生しません。
WRITE !,$LISTSAME("","abc")
WRITE !,$LISTSAME("abc","")
以下の $LISTSAME 比較により、<LIST> エラーが発生します。これは、リスト (NULL リストであっても) は文字列と比較できないためです。
SET x = $LISTBUILD("")
WRITE !,$LISTSAME("abc",x)
WRITE !,$LISTSAME(x,"abc")
“Empty” リストの比較
$LISTVALID では以下のすべてを有効なリストと見なします。
WRITE $LISTVALID(""),!
WRITE $LISTVALID($LB()),!
WRITE $LISTVALID($LB(UndefinedVar)),!
WRITE $LISTVALID($LB("")),!
WRITE $LISTVALID($LB($CHAR(0))),!
WRITE $LISTVALID($LB(,))
$LISTSAME では以下のペアのみを同一と見なします。
WRITE $LISTSAME($LB(),$LB(UndefinedVar)),!
WRITE $LISTSAME($LB(,),$LB(UndefinedVarA,UndefinedVarB)),!
WRITE $LISTSAME($LB(,),$LB()_$LB())
空の要素
$LISTBUILD は、要素間にコンマを追加するか、1 つ以上のコンマをいずれかの要素リストの末尾に追加することにより、空の要素を作成できます。$LISTSAME は空の要素を認識し、これらを NULL 文字列要素と同等には扱いません。
以下の $LISTSAME の例はすべて 0 (同一ではない) を返します。
WRITE $LISTSAME($LISTBUILD(365,,367),$LISTBUILD(365,367)),!
WRITE $LISTSAME($LISTBUILD(365,366,),$LISTBUILD(365,366)),!
WRITE $LISTSAME($LISTBUILD(365,366,,),$LISTBUILD(365,366,)),!
WRITE $LISTSAME($LISTBUILD(365,,367),$LISTBUILD(365,"",367))
$DOUBLE リスト要素
$LISTSAME は、0、-0、$DOUBLE(0)、および $DOUBLE(-0) のすべてゼロ形式を同一と見なします。
$LISTSAME は $DOUBLE(“NAN”) リスト要素と別の $DOUBLE(“NAN”) リスト要素と同一と見なします。ただし、NAN (非数値) は数値演算子を使用して有意義に比較できないため、$DOUBLE("NAN") と別の $DOUBLE("NAN") を比較しようとする InterSystems IRIS 演算 (等しい、より小さい、より大きいなど) は以下の例のように失敗します。
SET x = $DOUBLE("NAN")
SET a = $LISTBUILD(1,2,x)
SET b = $LISTBUILD(1,2,x)
WRITE !,$LISTSAME(a,b) /* 1 (NAN list elements same) */
WRITE !,x=x /* 0 (NAN values not equal) */
入れ子のリストおよび連結されたリスト
$LISTSAME では、入れ子になったリストに対するサポートはありません。コンテンツが同一であっても、リストを含む 2 つのリストを比較することはできません。
SET x = $LISTBUILD("365")
SET y = $LISTBUILD(365)
WRITE !,$LISTSAME(x,y)," lists identical"
WRITE !,$LISTSAME($LISTBUILD(x),$LISTBUILD(y))," nested lists not identical"
以下の例で、これらのリストは同一と見なされないため、$LISTSAME 比較はどちらも 0 を返します。
SET x=$LISTBUILD("Apple","Pear","Walnut","Pecan")
SET y=$LISTBUILD("Apple","Pear",$LISTBUILD("Walnut","Pecan"))
SET z=$LISTBUILD("Apple","Pear","Walnut","Pecan","")
WRITE !,$LISTSAME(x,y)," nested list"
WRITE !,$LISTSAME(x,z)," null string is list item"
$LISTSAME では、連結されたリストをサポートします。以下の例は、2 つのリストが同一と見なされるため、1 を返します。
SET x=$LISTBUILD("Apple","Pear","Walnut","Pecan")
SET y=$LISTBUILD("Apple","Pear")_$LISTBUILD("Walnut","Pecan")
WRITE !,$LISTSAME(x,y)," concatenated list"
関連項目
-
$LIST 関数
-
$LISTBUILD 関数
-
$LISTDATA 関数
-
$LISTFIND 関数
-
$LISTGET 関数
-
$LISTLENGTH 関数
-
$LISTNEXT 関数
-
$LISTUPDATE 関数
-
$LISTVALID 関数
-
$DOUBLE 関数