(for Internet Explorer)
Sub  ResetSearchDataOfGraphVertex( in_out_Graph as array of GraphVertexClass )
前回探索した結果を格納する内部変数をリセットします。
【引数】
in_out_Graph
操作対象のグラフ
ソース
→ vbslib.vbs
探索を行う関数の内部から呼ばれます。
::ParentIndex を Empty に設定します。
テスト
→ T_Tree.vbs
T_BreadthFirstSearch
未対応
Sub  RemoveNDEdgeInGraph( in_out_Graph as array of GraphVertexClass,
    in_BaseIndex as integer, in_TargetIndex as integer )
グラフの辺にあたる変数を削除します。(無向グラフ)
【引数】
in_out_Graph
対象のグラフ
in_BaseIndex
辺の頂点番号
ソース
→ vbslib.vbs
in_TargetIndex
辺のもう片方の頂点番号
未対応。 AdjacentIndexes の調整ができていません。
ND は、無向グラフの略語です。
1つの辺に、有向グラフと無向グラフを共存することはできません。 異なる辺ならできます。
関連
有向グラフ版
Sub  RemoveEdgeInGraph( in_out_Graph as array of GraphVertexClass,
    in_BaseIndex as integer, in_TargetIndex as integer )
グラフの辺にあたる変数を削除します。(有向グラフ)
【引数】
in_out_Graph
対象のグラフ
in_BaseIndex
辺の元の頂点番号
ソース
→ vbslib.vbs
in_TargetIndex
辺の先の頂点番号
未対応。 AdjacentIndexes の調整ができていません。
関連
無向グラフ版
1つの辺に、有向グラフと無向グラフを共存することはできません。 異なる辺ならできます。
ツリー構造を持ったコレクションです。
TreeA_NodeClass の Item メンバーに、ユーザーが使うオブジェクトを設定します。
TreeA_NodeClass
TreeA_NodeClass
TreeA_NodeClass
TreeA_NodeClass
Item
Item
Item
Item
Item
TreeA_Class のオブジェクト(ルート)のみ
のハンドルを持っているため、TreeA_Class の
オブジェクトが参照されなくなったときに、すべてのノードが削除されます。
Class  SampleClass
    Public  TreeNode
End Class

Sub  Main()
    Set tree = new_TreeA_Class( new SampleClass )
    Set tree.Item.TreeNode = tree.TreeNode  '// Don't set "tree"

    Set child_item = new SampleClass
    Set child_item.TreeNode = Me.TreeNode.AddNewNode( child_item )
End Sub
サンプル
参考
テスト
→ T_Tree.vbs
T_TreeA_1
ソース
→ vbslib.vbs
のキーや配列番号で参照することで、オブジェクト同士の直接の相互参照をしなければ、
TreeA_Class を使用しなくてもよいかもしれません。
注意
Function  new_TreeA_Class( Item ) as TreeA_Class
ツリーのルートを生成します。
【引数】
Item
ルートのノードと関連付けるオブジェクト、または、Nothing
返り値
ツリーのルート
ソース
→ vbslib.vbs
.TreeNode
ツリー構造のルート。
相互参照するときのルート ノード
.Item
ノードと関連するオブジェクト
.ParentNode
Nothing
.ChildNodes
直下の子ノードの配列
.ParentItems
親ノードの Item の配列。 Me のノードは含まない。 最後はルート。
.ChildItems
末端まで含めた子ノードの配列
TreeA_Class のオブジェクト(ルート)のみ
のハンドルを持っているため、TreeA_Class の
オブジェクトが参照されなくなったときに、すべてのノードが削除されます。 (参照されていないノードのみ)
ソース
→ vbslib.vbs
ツリー構造のノード。 ルート(根ノード)、ブランチ(内部ノード)、リーフ(葉ノード)。
.TreeNode
相互参照するときのルート ノード。 Me と同じ
.Item
ノードと関連するオブジェクト
.ParentNode
親ノード
.ChildNodes
直下の子ノードの配列
.ParentItems
親ノードの Item の配列。 Me のノードは含まない。 最後はルート。
.ChildItems
末端まで含めた子ノードの配列
ソース
→ vbslib.vbs
テスト
ソース
→ T_CrossFind.vbs
→ ToolsLib.vbs
CrossFindClass
.Projects
.OutElements
.OutModuleTypes
ArrayClass of
dictionary of
サンプル
<Root>
    <Project  name="p1">
        <Module  name="t11">a1, a2</Module> <Module  name="t12">b1, b2</Module>
    </Project>
    <Project  name="p2">
        <Module  name="t21">a1, a2</Module> <Module  name="t22">b1, b2</Module>
    </Project>
    <Project  name="p3">
        <Module  name="t31">a1, b1</Module> <Module  name="t32">a2</Module>
              <Module  name="t33">b2</Module>
    </Project>

    <Answer>
        <Element  name="a1">
            <ModuleType  names="t11, t21">a1, a2</ModuleType>
            <ModuleType  names="t31">a1, b1</ModuleType>
        </Element>
        <Element  name="a2">
            <ModuleType  names="t11, t21, t32">a1, a2</ModuleType>
        </Element>
        <Element  name="b1">
            <ModuleType  names="t12, t22">b1, b2</ModuleType>
            <ModuleType  names="t31">a1, b1</ModuleType>
        </Element>
        <Element  name="b2">
            <ModuleType  names="t12, t22, t33">b1, b2</ModuleType>
        </Element>
    </Answer>
</Root>
モジュールを構成する要素が同じかどうかで分類します。
分類したものをモジュール タイプと呼びます。
モジュール名と要素名(モジュールを構成する要素の名前)が、プロジェクトで1つである
状況で使えます。
下記サンプルの <Project> は分類する前のモジュールの構成を表します。
<Answer> は、CrossFindClass で解析した結果を表しています。
<Answer> の子要素である <Element> は、要素ごとに、所属しているモジュール タイプを
子要素に持っています。
たとえば、a1 という要素は、
  ・プロジェクト p1 に含まれる t11 モジュール
  ・プロジェクト p2 に含まれる t21 モジュール
  ・プロジェクト p3 に含まれる t31 モジュール
に含まれていますが、これらのモジュールは、構成要素ごとに、
  ・{ a1, a2 } から構成されるモジュール タイプ
  ・{ a1, b1 } から構成されるモジュール タイプ
に分類されます。
<Module  name="t11">a1, a2</Module>
<ModuleType  names="t11, t21">a1, a2</ModuleType>
→ T_CrossFind.vbs - Variable: A1.xml
参考
    Set find_ = new CrossFindClass

    Set project = find_.AddProject( "p1" )
    project.AddModule  "t11", Array( "a1", "a2" )
    project.AddModule  "t12", Array( "b1", "b2" )

    Set project = find_.AddProject( "p2" )
    project.AddModule  "t21", Array( "a1", "a2" )
    project.AddModule  "t22", Array( "b1", "b2" )

    Set project = find_.AddProject( "p3" )
    project.AddModule  "t31", Array( "a1", "b1" )
    project.AddModule  "t32", Array( "a2" )
    project.AddModule  "t33", Array( "b2" )

    For Each  element_name  In  find_.OutElements.Keys
        echo  "element_name = "+ element_name
        Set element = find_.OutElements.Item( element_name )
        For  k=0  To  element.OutModuleTypes.Count - 1
            Set module_type = element.OutModuleTypes.Item(k)
            echo  vbTab +"module_type.Names = "+ module_type.Name
            echo  vbTab +"Elements = "+ new_ArrayClass( module_type.Delegate.Elements ).CSV
            echo  ""
        Next
    Next
データのサンプル:
コードのサンプル:
主な処理は、
.ModuleTypesByElement
dictionary array NameOnlyClass
 (.vbs)
 (.vbs)
(.vbs)
(.vbs)
Function  CrossFindClass::AddProject( in_ProjectName as string ) as CrossFind_ProjectClass
CrossFindClass のプロジェクトを追加します。
【引数】
in_ProjectName
プロジェクト名
返り値
追加したプロジェクト
ソース
→ ToolsLib.vbs
Property  CrossFindClass::OutElements() as dictionary of CrossFind_OutElementClass
    Key=ElementName
CrossFindClass の解析結果。
キーは、
で追加したモジュール名。
アイテムは、
ソース
→ ToolsLib.vbs
CrossFindClass のプロジェクト。
ソース
→ ToolsLib.vbs
.Name
string
要素の名前
ArrayClass of
CrossFind_ModuleClass
.Modules
モジュールの配列
Sub  CrossFindClass::AddModule( in_ModuleName as string,  in_Elements as array of string )
CrossFindClass のプロジェクトにモジュールを追加します。
【引数】
in_ModuleName
モジュール名
in_Elements
モジュールを構成する要素の名前の配列
ソース
→ ToolsLib.vbs
CrossFindClass の解析結果。
.Name
.OutModuleTypes
string
CrossFind_OutModuleTypeClass
で取得します。
要素の名前
ソース
→ ToolsLib.vbs
CrossFindClass の解析結果。
.Names
.Elements
ArrayClass of string
ArrayClass of string
で取得します。
同じ構成要素を持つモジュールの名前の配列
OutModuleTypes
モジュールを構成する要素の名前の配列
ソース
→ ToolsLib.vbs
アルゴリズム メモ (CrossFindClass)
b1 => { b1, b2 }
a1 => { a1, a2 }, { a1, b1 }
b1 => { b1, b2 }, { a1, b1 }
{ a1, b1 }
候補を絞っていく
候補がなくなったら、Module を追加する(A1.xml)か、
Element を追加する(A3.xml)か、どっち?
{ a1, b1 } をすべて(a1, b1)に追加する
a1 => { a1, a2 }
a2 => { a1, a2 }
a3 =>
{ a1, a2, a3 }
{ a1, a2, a3 }
{ a1, a2, a3 }
a3 に 全ての要素 { a1, a2, a3 } を追加
a3 を除いた { a1, a2 } を変更する
{ a1, b1 }
a1 => { a1, a2 }
{ a1, b1 }
(すべての)新規 (a3) を除いたモジュールがあれば、
要素すべて(a1 と b1)が既存なので
(既存の異なる2つのモジュールをクロスするので)
すべての要素を含むモジュールを見つける
=> { a1, a2 }, { a1, b1 }
=> { a1, b1 }
a3 を除いたのが { a1, b1 } でないときは、すべて追加する
a1 => { a1, a2 }
a2 => { a1, a2 }
a3 =>
新規 (a3) を除いたのが一部のときは、
({ a1, a3 } については、)
Module を追加する
{ a1, a3 }
{ a1, a3 }
Sub  QuickSort( Arr as object array, iLeft as integer, iRight as integer,
                CompareFunc as function, CompareFuncParam as variant )
【引数】
Arr
iLeft
ソートする配列。(*1)
ソートする範囲。配列番号の最小値
配列をクイックソートします。安定ソートではありません。
ソートする範囲。配列番号の最大値
iRight
CompareFunc
CompareFuncParam
CompareFunc の第3引数
Option Explicit

Class  ClassA : Public id : End Class

Sub  Main( Opt, AppKey )
    ReDim  arr(4)
    Set arr(0) = new ClassA : arr(0).id = 6
    Set arr(1) = new ClassA : arr(1).id = 3
    Set arr(2) = new ClassA : arr(2).id = 4
    Set arr(3) = new ClassA : arr(3).id = 4
    Set arr(4) = new ClassA : arr(4).id = 1


    QuickSort  arr, 0, UBound( arr ), GetRef("CmpFunc1"), Empty


    echo  arr(0).id &","& arr(1).id &","& arr(2).id &","& _
        arr(3).id &","& arr(4).id
End Sub

Function  CmpFunc1( left, right, param )
    CmpFunc1 = left.id - right.id    '// 降順なら right.id - left.id
End Function
サンプル
→ クイックソート
配列の要素はオブジェクトであること。
参考
テスト
Arr 引数は、Visual Basic 標準の配列でも、ArrayClass でも構いませんが、
ArrayClass::Items は指定できません。(ソートされません。)
(*1)
→ T_QSort.vbs
関連
ソース
→ vbslib.vbs
出力
1,3,4,4,6
Sub  ShakerSort( Arr as array of Object, iLeft as integer, iRight as integer,
                 CompareFunc as function, CompareFuncParam as variant )
【引数】
Arr
iLeft
ソートする配列。(*1)
ソートする範囲。配列番号の最小値。 通常 0
配列をシェーカーソートします。安定ソートです。
ソートする範囲。配列番号の最大値。 通常 UBound(Arr)
iRight
CompareFunc
CompareFuncParam
CompareFunc の第3引数
Class  ClassA : Public id : End Class

Redim  arr(4)
Set arr(0) = new ClassA : arr(0).id = 6
Set arr(1) = new ClassA : arr(1).id = 3
Set arr(2) = new ClassA : arr(2).id = 4
Set arr(3) = new ClassA : arr(3).id = 4
Set arr(4) = new ClassA : arr(4).id = 1


ShakerSort  arr, 0, UBound( arr ), GetRef("CmpFunc1"), Empty


WScript.Echo  arr(0).id &","& arr(1).id &","& arr(2).id &","& _
              arr(3).id &","& arr(4).id

Function  CmpFunc1( Left, Right, Param )
  CmpFunc1 = Left.id - Right.id    '// 降順なら Right.id - Left.id
End Function
サンプル
(src)
  Dim    line
  ReDim  lines(-1)
  Set f = OpenForRead( target_result_txt )
  Do Until  f.AtEndOfStream
    Set line = new String1
    line.s = f.ReadLine()
    ReDim Preserve  lines( UBound( lines ) + 1 )
    Set lines( UBound( lines ) ) = line
  Loop
  f = Empty

  ShakerSort  lines, 0, UBound( lines ), GetRef("StrCmpFunc"), 1

Function  StrCmpFunc( Left, Right, Param )
  StrCmpFunc = StrComp( Left.s, Right.s, Param )
End Function

Class  String1
  Public  s
End Class
文字列を昇順にソートするサンプル
配列の要素はオブジェクトであること。
テスト
参考
Arr 引数は、Visual Basic 標準の配列でも、ArrayClass でも構いませんが、
ArrayClass::Items は指定できません。(ソートされません。)
(*1)
→ T_ShakerSort.vbs
関連
Function  CompareFunction( Left as variant, Right as variant, Parameter as variant ) as integer
2つのパラメーターを比較する関数の型。 関数名は、CompareFunction とは限りません。
【引数】
Left
Right
1つ目の比較対象
2つ目の比較対象
Parameter
比較に使う補助パラメーター
返り値
0:等しい、正の数:Left が大きい、負の数:Rightが大きい (昇順:小→大のとき)
も、この関数型ですが、GetRef("StrComp") はエラーになります。
Left、Right は、
などの関数に指定するコレクションの要素です。
Param には、ShakerSort などの関数にある引数がそのまま渡ります。
昇順:小→大にするときは、Left - Right の値を返してください。
降順にするときは、返り値の正と負を変えてください。
関連
Function  SampleStaticClass_comparePriority( in_Left, in_Right, in_Parameter )
    SampleStaticClass_comparePriority = in_Left.Priority - in_Right.Priority
End Function
サンプル
Function  StdCompare( Left as variant, Right as variant, Param as variant ) as integer
2つのパラメーターを標準的な方法で比較します。 (StdCompare = Standard Compare)
Left
Right
返り値
です。
数値
数値
-1, 0, 1 のどれか。(=や>と同じ)
文字列
文字列
StrComp と同じ (=や>と同じ)。Param 引数も同じ
オブジェクト
オブジェクト
の結果が True なら 0、 False なら -1
Empty
Empty
0
Empty 以外
Empty
1 (昇順でソートすると、Emptyが最後になる)
Empty
Empty 以外
-1
日付
日付
古い方が小さい値となる返り値 (=や>と同じ)
任意の型
Left と異なる型
-1 (エラーにはならない)
テスト
→ T_QSort.vbs # [T_CompareFunc]
Param 引数は、Left と Right が文字列のときだけ有効です。
→ vbslib.vbs
ソース
Function  NameCompare( Left as variant, Right as variant, Param as variant ) as integer
2つのパラメーターを Name プロパティで比較します。
Left
Right
返り値
です。
オブジェクト
オブジェクト
Name プロパティを StrComp に渡した結果
オブジェクト以外
オブジェクト以外
0
オブジェクト以外
オブジェクト
-1 (昇順でソートすると、オブジェクト以外が最後になる)
オブジェクト
オブジェクト以外
1
テスト
→ T_QSort.vbs # [T_CompareFunc]
Param 引数は、StrComp 関数と同じです。
→ vbslib.vbs
ソース
Function  NumStringCompare( Left as variant, Right as variant, Param as variant ) as integer
文字列の中の数字を複数桁の正の整数値として比較します。
です。
Left
Right
返り値
"A10"
"A2"
正の数値(Left > Right)、数値10と2 の比較
"A"
"a"
負の数値(Left < Right)
正の数値(Left > Right)、大文字小文字を区別しない
"a"
"B"
"A10"
"A10.2"
負の数値(Left < Right)
"A10.2"
"A10.10"
正の数値(Left > Right)、小数ではなく整数.整数とする
負の数値(Left < Right)
"A2"
"A1"
"A-2"
"A-1"
負の数値(Left < Right)、マイナスとは見なさない
関連
テスト
→ T_QSort.vbs
T_NumStringCompare
Param 引数には、Empty または
を指定してください。
ファイル名でソート
したときと同じになります。 ただし、フォルダーの区切り記号 \ や / を含む文字列
を比較するときは、
を使ってください。
→ vbslib.vbs
ソース
10.10 は小数ではなく、バージョン番号のように 10 の 10 であるとします。