2024/08/30

LotusScript で値のソートを作成

ノーツでアプリ開発を行っていると値をソートしたくなることがあります。@関数には @Sort という関数があるのですが、LotusScript には存在しないようです。そこで、今回は LotusScript でソートする関数を作成します。


アルゴリズムとソート

プログラミングを勉強しているとアルゴリズムという言葉に絶対に出会いますよね。簡単に言うと問題解決の手法となるのですが、ソート(並べ替え)という問題はアルゴリズムを語るうえで格好の題材になります。

バブルソートやクイックソート、ヒープソートなど、ソートにはさまざまなアルゴリズムが存在します。わかりやすいこと、平均的に速いことなどそれぞれに特徴があります。また、ランダムな値を並べ替える場合やランキングのようにソートされたデータに値が 1 つ増えるような場合など、入力データの状態による得手不得手があります。

ソートは身近な問題ですが、なかなか奥が深いと言えます。ネットで検索するとたくさんの情報が出てきます。興味のある方は一度調べてみてください。きっと、プログラミングスキルの向上につながると思いますよ。


今回のテーマとバブルソート

アルゴリズムについて語ることが今回のテーマではありません。実際に LotusScript でソートを実現する方法について紹介することが目的です。ですので、今回は処理がわかりやすいバブルソートを採用します。

バブルソートは隣り合った値を比較、大小関係が違う場合入れ替えを行います。これを繰り返しソートを実現します。例えば、5, 7, 3, 1 という 4 つの値をバブルソートする操作は次のようになります。

5 7 3 1 5 と 7 を比較
5 7 3 1 7 と 3 を比較、入れ替え
5 3 7 1 7 と 1 を比較、入れ替え(7 が確定)
5 3 1 7 5 と 3 を比較、入れ替え
3 5 1 7 5 と 1 を比較、入れ替え(5 が確定)
3 1 5 7 3 と 1 を比較、入れ替え
1 3 5 7 ソート完了(すべて確定)

最初は 4 つすべての値で比較を行うので、比較は 3 回発生します。これで、最大値の 7 が確定しますので、次の比較は確定していない 3 つの値で比較しています。これを繰り返し、すべての値が確定したらソート完了です。


LotusScript で実現

上表の流れで LotusScript でバブルソートを実現すると次のようになります。

Function xSort(vvData As Variant) As Variant
   Dim i As Integer
   Dim j As Integer
   Dim v As Variant
   Dim vRtn As Variant

   '戻り値配列を準備
   vRtn = vvData

   '値をソート
   For j = 1 To Ubound(vRtn)
      For i = 0 To Ubound(vRtn) - j
         If vRtn(i) > vRtn(i+1) Then
            '値を入れ替え
            v = vRtn(i)
            vRtn(i) = vRtn(i+1)
            vRtn(i+1) = v
         End If
      Next
   Next

   'ソートした配列を返す
   xSort = vRtn
End Function

隣り合った要素の比較するため、ループ変数を使って i と i+1 で表しています。

         If vRtn(i) > vRtn(i+1) Then

そして、確定した要素をループからはじくため外側のループの値を使って内側のループ数をコントロールしています。

      For i = 0 To Ubound(vRtn) - j


関数のテスト

動作確認のため、簡単なテストフォームを作成します。

フィールドはそれぞれ複数値を設定可能としています。ボタンには先ほどの xSort 関数を配置し、テストコードを Click イベントに記述します。

Sub Click(Source As Button)
   Dim nuiw As New NotesUIWorkspace
   Dim nuid As NotesUIDocument
   Dim nd As NotesDocument
   Dim v As Variant

   Set nuid = nuiw.CurrentDocument
   Set nd = nuid.Document

   nd.Sort = xSort(nd.Src)
End Sub

実行すると、次のようにソートできることが確認できます。

0 件のコメント:

コメントを投稿