2024/10/09

リスト配列

先日、LotusScript でリスト配列を使う機会がありました。初めての利用だったのでヘルプで調べながら開発を行いました。せっかく調べたので、機能を整理しておきます。


リスト配列とは?

LotusScript では、Boolean、Integer、String などさまざまなデータ型が存在します。そして、同じデータ型の値をまとめて管理する構造体があります。配列というとなじみがありますよね。List も配列の一種です。

通常の配列は a1(0) など変数の後ろにカッコでインデックス番号(添え字や要素番号とも言います)を付けると値にアクセスできます。一方、List の場合は、インデックス番号の代わりに文字列(以下リストタグと呼ぶ)を使用します。

例えば、ユーザとそのユーザの点数を管理する場合を考えてみましょう。それぞれ、次のようなコードとなります。

List の場合 配列の場合
aiScore("Ito") = 75
aiScore("Sato") = 90
asName(0) = "Ito"
asName(1) = "Sato"
aiScore(0) = 75
aiScore(1) = 90


宣言方法

リスト配列を宣言するには次のように記述します。

   Dim aiScore List as Integer

aiScore("Ito") と配列のように記述するのですが、宣言に ( ) は必要ありません。要素や領域の確保は不要ということですね。また、配列のように多次元にすることはできません。


値の追加方法

リスト配列に値を追加するのは簡単です。次のように要素にリストタグを指定するだけです。

    aiScore("Ito") = 75

リスト配列内に "Ito" という要素がなければ新規で追加され、値がセットされます。すでに存在した場合は、値が更新されます。配列のように ReDim 操作が不要なので便利ですね。


値のアクセス

リスト配列の値のアクセスも値との追加と同じように、リストタグを指定するだけです。例えば、以下のコードはリストタグ Ito の値を 10 加算しています。

    aiScore("Ito") = aiScore("Ito") + 10


ループ

平均値を出力するなど、リスト内のすべての要素にアクセスしたい場合があります。このような処理には Forall ループを使用します。

例えば、次のコードではリスト配列 aiScore の合計 iSum と 件数 iCnt を算出し、平均を表示しています。

   ForAll iScore In aiScore
      iSum = iSum + iScore
      iCnt = iCnt + 1
   End ForAll

   MsgBox "平均点 = " & Format(iSum / iCnt, "#0.0")

Forall で使用している iScore がリスト配列の各要素(値)が順に入る変数です。


リスト配列の各種操作

上記情報で、リスト配列の通常使用は可能だと思います。ここから先はリスト配列利用に関連する各種操作をまとめます。チェックなど込み入った操作をする場合などに参考にできます。


◇ リストタグの取得

Forall ループの処理では、各要素の値がループ変数にセットされました。その値のリストタグを取得する関数が ListTag 関数です。

次のコードではリスト配列 aiScore のすべてのリストタグを順に表示します。

   ForAll iScore In aiScore
      MsgBox ListTag(iScore)
   End ForAll


◇ 要素の存在確認

続いては指定したリストタグが、リスト内に存在するか判定する方法です。次のコードではリスト配列 aiScore に Tanaka の要素があるか判定します。

   If IsElement(aiScore("Tanaka")) Then
      MsgBox "リスト配列内に存在します!"
   Else
      MsgBox "リスト配列内に存在しません。"
   End If


◇ 要素の削除

Erase ステートメントを使用するとリスト内の要素を削除することができます。

   Erase aiScore("Hata")

もし、指定した要素がリスト配列内に存在しない場合、エラーが発生します。


◇ リスト配列の初期化

Erase ステートメントを使用するとリスト配列内のすべてのエントリを削除し初期化することができます。

   Erase aiScore

リストタグを指定せず変数名を指定するとすべての要素を削除するということですね。


◇ リスト変数の判定

DataType 関数を使用すると変数のデータタイプが取得できます。

   Dim aiScore List As Integer
   MsgBox DataType(aiScore)

リスト配列は 2048 となりますが、上記の結果は 2050 となります。これは 整数型のリスト配列のためで、リスト配列 2048 + 整数型 2 = 2050 となります。型により値が変わるので注意が必要です。

また、リスト配列かを判定するだけであれば IsList 関数が便利です。

   If IsList(aiScore) Then
      MsgBox "aiScore はリスト配列です。"
   Else
      MsgBox "aiScore はリスト配列ではありません。"
   End If


◇ 空の判定

リスト配列を宣言した直後や Erase で初期化した後は、中身が空っぽの状態となります。この判定の方法については明確な関数は発見できませんでした。Ubound や Lbound のような関数はないようです。また、残念ながら IsEmpty の戻り値は True となり判定できませんでした。

Forall ループでは、ループ内の処理が一切実行されないので、それで判定する方法が良いかもしれませんね。


まとめ

今回は、リスト配列の使い方についてまとめました。配列と同様に、同じデータ型の値をまとめて管理できる変数でした。要素のアクセスは リストタグ と呼ばれる文字列で指定する点がポイントですね。

この記事の最初に『ユーザとそのユーザの点数を管理する場合』の例を上げ、配列との比較をしました。どちらが優れているという話をしたかったわけではありません。配列とリスト配列、近しい機能ではありますが、それぞれ違いがあります。作成するプログラムの仕様に合わせて、適材適所、使い分けができるといいですね。


0 件のコメント:

コメントを投稿