[Notes/Domino] 配列の push、pop、shift、unshift 用関数
Lotus Script には StrLeft など便利な関数もありますが、他の言語で普通にある関数が無かったりもします。
今回は、他の言語で一般的な、配列の push、pop、shift、unshift 関数を作ってみたいと思います。
※今のところ、いずれの関数も、引数にオブジェクトを指定することはできません。
push 関数 (AryPush)
説明 | 動的配列の後尾に値を追加する |
---|---|
構文 | AryPush(varAry As Variant, varVal As Variant) |
引数 | [in,out]varAry ... 処理対象の動的配列 [in,---]varVal ... 追加する値 |
戻り値 | なし |
ソースコード
Public Sub AryPush(varAry As Variant, varVal As Variant) Dim intMax As Integer If Isarray(varAry) = False Then Exit Sub End If On Error Goto ERR_INIT intMax = Ubound(varAry) + 1 On Error Goto 0 Redim Preserve varAry(intMax) varAry(intMax) = varVal Exit Sub ERR_INIT: intMax = 0 Redim varAry(0) Resume Next End Sub
例文
Dim v() as variant
Call AryPush(v, "aaa")
Call AryPush(v, "bbb")
↓
'vの値
aaa
bbb
※この関数はただ値を追加するだけなので、配列を初期化する必要がある場合は、Erase 文を使用して初期化してください。
pop 関数 (AryPop)
説明 | 動的配列の最後尾の要素を削除し、その要素を返す |
---|---|
構文 | AryPop(varAry As Variant) As Variant |
引数 | [in,out]varAry ... 処理対象の動的配列 |
戻り値 | 最後尾の要素 |
ソースコード
Public Function AryPop(varAry As Variant) As Variant Dim intMax As Integer If Isarray(varAry) = False Then Exit Function End If On Error Goto ERR_INIT intMax = Ubound(varAry) On Error Goto 0 AryPop = varAry(intMax) If Lbound(varAry) = intMax Then Erase varAry Else Redim Preserve varAry(intMax - 1) End If Exit Function ERR_INIT: Exit Function End Function
例文
Dim v1 As Variant Dim v2 As Variant v1 = Split("aaa,bbb,ccc", ",") v2 = AryPop(v1) ↓ 'v1の値 aaa bbb 'v2の値 ccc
shift 関数 (AryShift)
説明 | 動的配列の先頭の要素を削除し、その要素を返す |
---|---|
構文 | AryShift(varAry As Variant) As Variant |
引数 | [in,out]varAry ... 処理対象の動的配列 |
戻り値 | 先頭の要素 |
ソースコード
Public Function AryShift(varAry As Variant) As Variant Dim intMin As Integer Dim i As Integer If Isarray(varAry) = False Then Exit Function End If On Error Goto ERR_INIT intMin = Lbound(varAry) On Error Goto 0 AryShift = varAry(intMin) If Ubound(varAry) = intMin Then Erase varAry Else For i = intMin To (Ubound(varAry) - 1) varAry(i) = varAry(i + 1) Next Redim Preserve varAry(Ubound(varAry) - 1) End If Exit Function ERR_INIT: Exit Function End Function
例文
Dim v1 As Variant Dim v2 As Variant v1 = Split("aaa,bbb,ccc", ",") v2 = AryShift(v1) ↓ 'v1の値 bbb ccc 'v2の値 aaa
unshift 関数 (AryUnshift)
説明 | 動的配列の先頭に値を追加する |
---|---|
構文 | AryUnshift(varAry As Variant, varVal As Variant) |
引数 |
[in,out]varAry ... 処理対象の動的配列 [in,---]varVal ... 追加する値 |
戻り値 | なし |
ソースコード
Public Sub AryUnshift(varAry As Variant, varVal As Variant) Dim intMax As Integer Dim i As Integer If Isarray(varAry) = False Then Exit Sub End If On Error Goto ERR_INIT intMax = Ubound(varAry) + 1 On Error Goto 0 Redim Preserve varAry(intMax) For i = (intMax - 1) To Lbound(varAry) Step - 1 varAry(i + 1) = varAry(i) Next varAry(Lbound(varAry)) = varVal Exit Sub ERR_INIT: intMax = 0 Redim varAry(0) Resume Next End Sub
例文
v = Split("aaa,bbb", ",")
Call AryUnshift(v, "ccc")
↓
'vの値
ccc
aaa
bbb
(おまけ)AryIsUninit
説明 | 動的配列が未初期化状態かどうか調べる |
---|---|
構文 | AryIsUninit(varAry As Variant) As Boolean |
引数 | [in,---]varAry ... 処理対象の配列 |
戻り値 | True: 未初期化、False: 未初期化ではない |
ソースコード
Public Function AryIsUninit(varAry As Variant) As Boolean Dim intMin As Integer On Error Goto ERR_INIT intMin = Lbound(varAry) On Error Goto 0 AryIsUninit = False Exit Function ERR_INIT: AryIsUninit = True Exit Function End Function
例文
Dim v() As Variant
Call AryPush(v, "aaa")
Call AryPop(v)
Msgbox Cstr(AryIsUninit(v)) 'True
---
ちなみに、個人的に最もよく使っているのは、AryPush 関数。コードがすっきりして、メンテナンスしやすくなるので、便利です。実装に例外を使っているところがイマイチですけど(汗
コメント
コメントはありません
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。