nsfl10n

Lotus Notes/Domino のブログ。nsf:Notes Storage Facility。l10n:Localization。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告|
  3. トラックバック(-)|
  4. コメント(-)

LotusScriptで簡単にリストをソートする

LotusScriptで簡単にリストをソートする SharePlace.info | article | "Smart Sorting" of List In Lotus Script

 リストはLotusscriptで非常に強力がデータ構造だ。要素を加えたり、取得したりするのも簡単に出来る。ここではリストのアドバンテージについて細かく言うつもりはない。その代わり、Lotusscriptでリストを"ソートする"シンプルで効果的な方法を紹介させて頂きたい。この記事の終わりには、なぜ私がソートするという言葉に引用符ダブルコーテーションを使ったのかが明らかになるだろう。

 実際、Lotusscriptには、リストをソートしてくれるメソッドはないと思われる。ここに一つの解決方法がある - すなわち、連結された文字列を集めてすべてにリストのタグをつける。リストに用を加えるときはいつでも、文字列にリストタグも付ければいい。

Dim lstMyList List As String Dim strTags As String lstMyList ("B") = "List" strTags = |"B"| lstMyList ("A") = "Sorting" strTags = StrTags & |:"A"| lstMyList ("D") = "Simple" strTags = StrTags & |:"D"| lstMyList ("C") = "Is" strTags = StrTags & |:"C"|

ソート前print結果:

Forall elements In lstMyList Print elements End Forall List Sorting Simple Is

 リストにすべての要素を加え終わったら、連結された文字に、@sortという@関数(ND6からの新機能)を送り込んで、Evaluate関数をソートされたリストタグが格納されている配列に対して実行します。

Dim varTagsArray As Variant varTagsArray = Evaluate (|@sort (| & strTags & |)|)

 一回リストタグが格納されている配列をソートし終わったら、ソートされたリストタグの順番にリストの要素を取得します。

ソート後のprint結果:

Dim i As Integer For i = 0 To Ubound (varTagsArray) Print (lstMyList (varTagsArray(i))) Next Sorting List Is Simple

 見たとおり、実際にはソートされていないというトリックだ。その代わりにリストタグの配列はソートされる。それゆえ、私は引用符ダブルコーテーションで"ソートする"と使ったのだ。この方法は、大きなリストオブジェクトを扱うときに最も役に立ち、オブジェクトはソートしている間メモリにコピーされないのだ。なぜなら、ダブルコーテーションのタグによって行われるのであり、値で行われるわけではないからであり、ソートのプロセスはより効率的に行われるからだ。

 大きい配列に対してこの方法でソートするなら、具体的に言うと1500以上の要素の場合、気を付けるべきだ。そこが@sortの限界だからだ。

========================

 でもこの方法だと、ロジックはシンプルだけど、パフォーマンスが出ない場合があるという指摘があったので、もうひとつ方法を示すことにする。もうひとつの方法は、"Quick Sort"と呼ばれる方法で、平均1.5-2秒かかっていた処理が、0.5-1秒にまで縮めることが出来る。

 二番目の方法:

 @sort関数をリストタグ全部の文字列に送り込んで、ソートされた配列を取得するのではなく、ダイナミックな配列にリストタグを加えるのだ。

Dim lstMyList List As String Dim varTagsArray () As String Dim varSortedTagArray As Variant Dim intArrIndex as Integer lstMyList ("B") = "List" Redim Preserve varTagsArray (intArrIndex) varTagsArray (intArrIndex) = "List" intArrIndex = intArrIndex + 1 lstMyList ("A") = "Sorting" Redim Preserve varTagsArray (intArrIndex) varTagsArray (intArrIndex) = "Sorting" intArrIndex = intArrIndex + 1 ...

 リストの要素すべてを加えたら、リストタグの配列に quick sort function (アドレス帳DBから取ってきた)に送り込む。

varSortedTagArray = QuickSort (varTagsArray),

quick sort function:

Function QuickSort(sArray As Variant) As Variant Dim sA() As String Dim j As Long Dim bottom As Long Dim top As Long bottom = Lbound ( sArray ) top = Ubound ( sArray ) Redim sA( bottom To top ) As String For j = bottom To top sA ( j ) = sArray ( j ) Next ' DoQS does a QuickSort if the Sublist is longer than 10 elements ' Thus, when DoQS finishes, all elements are within 10 spots of their correct location. ' For lists that are close to being in order, an Insertion Sort is much faster than a QuickSort, so we ' run through the whole thing once doing an Insertion Sort to finish tidying up the order. Call DoQS( sA, bottom, top ) Call DoInsertSort ( sA, bottom, top ) QuickSort = sA End Function Sub DoQS( sA() As String, bottom As Long, top As Long ) ' Called by QuickSort ' Uses Public variable sA (array of string) Dim length As Long Dim i As Long Dim j As Long Dim Pivot As Long Dim PivotValue As String Dim t As String Dim LastSmall As Long length = top - bottom + 1 ' Only do the QuickSort if the sublist is at least 10 items long If length > 10 Then ' Pivot is chosen approx. halfway through sublist. ' This gives us best speed if list is almost sorted already, and is no worse than any ' other choice if the list is in random order. Pivot = bottom + (length \ 2) ' Move PivotValue out of the way PivotValue = sA( Pivot ) sA ( Pivot ) = sA ( bottom ) sA ( bottom ) = PivotValue ' LastSmall is the location of the last value smaller than PivotValue LastSmall = bottom For i = bottom + 1 To top If sA ( i ) < PivotValue Then LastSmall = LastSmall + 1 t = sA ( i ) sA ( i ) = sA ( LastSmall ) sA ( LastSmall ) = t End If Next ' Move the PivotValue back t = sA ( LastSmall ) sA ( LastSmall ) = sA ( bottom ) sA ( bottom ) = t Pivot = LastSmall ' Now sort each side Call DoQS ( sA, bottom, Pivot - 1 ) Call DoQS ( sA, Pivot + 1, top ) End If End Sub Sub DoInsertSort ( sA() As String, Byval bottom As Long, Byval top As Long ) Dim i As Long Dim x As Long Dim v As String Dim Found As Integer For i = bottom+1 To top x = i v = sA (i ) Do While (sA(x-1) > v) sA ( x ) = sA ( x-1 ) x = x - 1 If x=0 Then Exit Do End If Loop sA (x) = v Next End Sub

 ソートされた配列を取得したら、リストをソートする記事の部分に戻って、その後の処理を参照してくれ。

This LotusScript was converted to HTML using the ls2html routine,
provided by Julian Robichaux at nsftools.com.
スポンサーサイト
  1. 2005/05/17(火) 01:04:51|
  2. Designer|
  3. トラックバック:0|
  4. コメント:0
<<WindowsのデスクトップにDBリンクを作成する | ホーム | LotusScriptをHTMLとして整形する>>

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://nsfl10n.blog9.fc2.com/tb.php/11-d4454f82
07 | 2017/08 | 09
Sun Mon Tue Wed Thu Fri Sat
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

Search

Featured Entries

Recent Entries

Recent Comments

Recent Trackbacks

Archives

Category

Links

Ads

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。