Takenoff Labs

Lotus Notes/Domino に関する Tips や、クラシックの名曲などを紹介します

[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 関数。コードがすっきりして、メンテナンスしやすくなるので、便利です。実装に例外を使っているところがイマイチですけど(汗

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
読み込み中...

Navigation

前の記事(カテゴリ内):

次の記事(カテゴリ内):

前の記事(日付順):

次の記事(日付順):

トラックバック

トラックバックはありません

コメント

コメントはありません

※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。





(以下のタグが使えます)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

For spam filtering purposes, please copy the number 8097 to the field below:

^
×