第29章Caché関数コレクション$ LISTFIND関数
指定されたリストで必要な値を検索します。
概要
$LISTFIND(list,value,startafter)
$LF(list,value,startafter)
パラメータ
- リスト計算の結果は、有効なリストの式です。リストは、1つ以上の要素を含むエンコードされた文字列です。リストを使用
$LISTBUILD
または$LISTFROMSTRING
作成するか、を使用$LIST
して別のリストからリストを抽出する必要があります。 - valueには、目的の要素値の式が含まれます。
- startafterは、オプションでリストの位置の整数式として解釈されます。検索はその位置の後の要素から始まるため、0は位置1から始まり、1は位置2から始まることを意味します。startafter = -1は有効な値ですが、一致は常に返されません。startafter値の整数部分のみが使用されます。
解説
$LISTFIND
指定されたリストで要求された値の最初のインスタンスを検索します。一致は正確で、完全な要素値を含んでいる必要があります。文字の比較では大文字と小文字が区別されます。数値は標準形式で比較されます。完全一致が見つかった場合、$LISTFIND
一致した要素の位置が返されます。値が見つからない場合、$LISTFIND
0 が返されます。
検索は、startafterパラメータで指定された位置の後の要素から始まります。startafterパラメータを省略すると、$LISTFIND
startafter値は0と見なされ、検索は最初の要素(要素1)から開始されます。
一致するものが見つからない場合、$LISTFIND
0 が返されます。startafterパラメータの値が存在しないリストメンバーを参照している場合$LISTFIND
も、0を返します。
$LISTVALID
関数を使用して、リストが有効なリストであるかどうかを判別できます。リストが有効なリストでない場合、システム<LIST>
はエラーを生成します。
startafterパラメータの値が-1未満の場合、$LISTFIND
関数を呼び出すとエラーが発生します。
空の文字列と空のリスト
$LISTFIND
次の例に示すように、関数を使用して空の文字列値を検索できます。
DHC-APP> SET x=$LISTBUILD("A","","C","D")
DHC-APP> WRITE $LISTFIND(x,"") ; returns 2
2
$LISTFIND
省略された要素を含むリストで使用できますが、省略された要素の検索には使用できません。次の例では、省略された要素を含むリスト内の値を検索します。
SET x=$LISTBUILD("A",,"C","D")
WRITE $LISTFIND(x,"C") ; returns 3
次の$LISTFIND
例は1を返します。
DHC-APP> WRITE $LISTFIND($LB(""),"") ; returns 1
1
次の$LISTFIND
例は0を返します。
DHC-APP>WRITE $LISTFIND("",""),!
0
DHC-APP>WRITE $LISTFIND($LB(),""),!
0
次の例のリストには、データを含むリストと連結された空のリストが含まれています。空のリストの前に追加すると、最終的に連結されたリスト内の要素のリストの位置が変更されます。
/// d ##class(PHA.TEST.Function).LISTFIND()
ClassMethod LISTFIND()
{
SET x=$LISTBUILD("A","B","C","D")
WRITE $LISTFIND(x,"B"),! ; returns 2
WRITE $LISTFIND(""_x,"B"),! ; returns 2
WRITE $LISTFIND($LB()_x,"B"),! ; returns 3
WRITE $LISTFIND($LB(,,,)_x,"B") ; returns 6
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND()
2
2
3
6
ただし、空の文字列を値のペアに連結することは$LISTFIND
無効です。
/// d ##class(PHA.TEST.Function).LISTFIND1()
ClassMethod LISTFIND1()
{
SET x=$LISTBUILD("A","B","C","D")
WRITE $LISTFIND(x,"B"),! ; returns 2
WRITE $LISTFIND(x,"B"_""),! ; returns 2
WRITE $LISTFIND(x,""_"B"),! ; returns 2
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND1()
2
2
2
例
次の例では、要求された文字列が最初に表示される位置である2を返します。
DHC-APP>SET x=$LISTBUILD("A","B","C","D")
DHC-APP>WRITE $LISTFIND(x,"B")
2
次の例は0を返し、要求された文字列が見つからなかったことを示します。
DHC-APP>SET x=$LISTBUILD("A","B","C","D")
DHC-APP>WRITE $LISTFIND(x,"E")
0
次の例は、startafterパラメータを使用した効果を示しています。最初の例は、要求された文字列を見つけることができず、startafter位置にあるため0を返します。
DHC-APP>SET x=$LISTBUILD("A","B","C","D")
DHC-APP>WRITE $LISTFIND(x,"B",2)
0
2番目の例は、要求された文字列の2番目の出現を検索し、最初の出現がstartafter位置の前にあるので4を返します。
DHC-APP>SET y=$LISTBUILD("A","B","C","A")
DHC-APP>WRITE $LISTFIND(y,"A",2)
4
$LISTFIND
関数は完全な要素のみに一致します。したがって、次の例では0が返されます。これは、すべての要素に「B」が含まれていても、リスト内のすべての要素が文字列「B」と等しくないためです。
DHC-APP>SET mylist = $LISTBUILD("ABC","BCD","BBB")
DHC-APP>WRITE $LISTFIND(mylist,"B")
0
次の数値の例はすべて、一致する前に数値が標準形に変換されているため、0を返します。これらの場合、文字列数値と正規形式の番号は一致しません。
/// d ##class(PHA.TEST.Function).LISTFIND2()
ClassMethod LISTFIND2()
{
SET y=$LISTBUILD("1.0","+2","003","2*2")
WRITE $LISTFIND(y,1.0),!
WRITE $LISTFIND(y,+2),!
WRITE $LISTFIND(y,003),!
WRITE $LISTFIND(y,4)
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND2()
0
0
0
0
次の数値の例は一致します。これは、数値が正規形式で比較されるためです。
/// d ##class(PHA.TEST.Function).LISTFIND3()
ClassMethod LISTFIND3()
{
SET y=$LISTBUILD(7.0,+6,005,2*2)
WRITE $LISTFIND(y,++7.000),! ; returns 1
WRITE $LISTFIND(y,0006),! ; returns 2
WRITE $LISTFIND(y,8-3),! ; returns 3
WRITE $LISTFIND(y,--4.0) ; returns 4
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND3()
1
2
3
4
指定されたstartafter値が一致しないため、次の例はすべて0を返します。
/// d ##class(PHA.TEST.Function).LISTFIND4()
ClassMethod LISTFIND4()
{
SET y=$LISTBUILD("A","B","C","D")
WRITE $LISTFIND(y,"A",1),!
WRITE $LISTFIND(y,"B",2),!
WRITE $LISTFIND(y,"B",99),!
WRITE $LISTFIND(y,"B",-1)
}
DHC-APP>d ##class(PHA.TEST.Function).LISTFIND4()
0
0
0
0
次の例は、$LISTFIND
ネストされたリストの検索を使用する方法を示しています。Cachéは、複数要素のネストされたリストを、リスト値を持つ単一のリスト要素として扱うことに注意してください。
DHC-APP> SET y=$LISTBUILD("A",$LB("x","y"),"C","D")
DHC-APP> WRITE $LISTFIND(y,$LB("x","y"))
2