(for Internet Explorer)
← ▼ ▲
↑
ResetSearchDataOfGraphVertex
Sub ResetSearchDataOfGraphVertex( in_out_Graph as array of GraphVertexClass )
前回探索した結果を格納する内部変数をリセットします。
【引数】
in_out_Graph
操作対象のグラフ
ソース
→ vbslib.vbs
探索を行う関数の内部から呼ばれます。
GraphVertexClass
::ParentIndex を Empty に設定します。
テスト
→ T_Tree.vbs
T_BreadthFirstSearch
← ▼ ▲
未対応
← ▼ ▲
RemoveNDEdgeInGraph
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 は、無向グラフの略語です。
１つの辺に、有向グラフと無向グラフを共存することはできません。 異なる辺ならできます。
関連
有向グラフ版
→ RemoveEdgeInGraph
← ▼ ▲
RemoveEdgeInGraph
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 の調整ができていません。
関連
無向グラフ版
→ RemoveNDEdgeInGraph
１つの辺に、有向グラフと無向グラフを共存することはできません。 異なる辺ならできます。
← ▼ ▲
TreeA_Class
ツリー構造を持ったコレクションです。
TreeA_NodeClass の Item メンバーに、ユーザーが使うオブジェクトを設定します。
TreeA_Class
TreeA_NodeClass
TreeA_NodeClass
TreeA_NodeClass
TreeA_NodeClass
TreeA_NodeClass
Item
Item
Item
Item
Item
TreeA_Class のオブジェクト（ルート）のみ
LifeGroupClass
のハンドルを持っているため、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
サンプル
→ 木構造 (データ構造) - Wikipedia (Web)
参考
テスト
→ T_Tree.vbs
T_TreeA_1
ソース
→ vbslib.vbs
辞書
のキーや配列番号で参照することで、オブジェクト同士の直接の相互参照をしなければ、
TreeA_Class を使用しなくてもよいかもしれません。
注意
← ▼ ▲
new_TreeA_Class
Function new_TreeA_Class( Item ) as TreeA_Class
ツリーのルートを生成します。
【引数】
Item
ルートのノードと関連付けるオブジェクト、または、Nothing
返り値
ツリーのルート
→ TreeA_Class
ソース
→ vbslib.vbs
← ▼ ▲
TreeA_Class
.TreeNode
ツリー構造のルート。
相互参照するときのルート ノード
.Item
ノードと関連するオブジェクト
.ParentNode
Nothing
.ChildNodes
直下の子ノードの配列
.ParentItems
親ノードの Item の配列。 Me のノードは含まない。 最後はルート。
.ChildItems
末端まで含めた子ノードの配列
TreeA_Class のオブジェクト（ルート）のみ
LifeGroupClass
のハンドルを持っているため、TreeA_Class の
オブジェクトが参照されなくなったときに、すべてのノードが削除されます。 （参照されていないノードのみ）
→ TreeA_NodeClass
ソース
→ vbslib.vbs
← ▼ ▲
TreeA_NodeClass
ツリー構造のノード。 ルート（根ノード）、ブランチ（内部ノード）、リーフ（葉ノード）。
.TreeNode
相互参照するときのルート ノード。 Me と同じ
.Item
ノードと関連するオブジェクト
.ParentNode
親ノード
.ChildNodes
直下の子ノードの配列
.ParentItems
親ノードの Item の配列。 Me のノードは含まない。 最後はルート。
.ChildItems
末端まで含めた子ノードの配列
ソース
→ vbslib.vbs
← ▼ ▲
CrossFindClass
テスト
ソース
→ T_CrossFind.vbs
→ ToolsLib.vbs
データ構造
CrossFind_ProjectClass
CrossFindClass
CrossFind_OutElementClass
CrossFind_OutModuleTypeClass
.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>
モジュールを構成する要素が同じかどうかで分類します。
分類したものをモジュール タイプと呼びます。
モジュール名と要素名（モジュールを構成する要素の名前）が、プロジェクトで１つである
状況で使えます。
下記サンプルの <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
データのサンプル：
コードのサンプル：
主な処理は、
→ OutElements (CrossFindClass)
.ModuleTypesByElement
dictionary array NameOnlyClass
CrossFind_ModuleClass
(.vbs)
(.vbs)
(.vbs)
(.vbs)
← ▼ ▲
AddProject (CrossFindClass)
Function CrossFindClass::AddProject( in_ProjectName as string ) as CrossFind_ProjectClass
CrossFindClass のプロジェクトを追加します。
【引数】
in_ProjectName
プロジェクト名
返り値
追加したプロジェクト
<< CrossFindClass
→ CrossFind_ProjectClass
ソース
→ ToolsLib.vbs
← ▼ ▲
OutElements (CrossFindClass)
<< CrossFindClass
Property CrossFindClass::OutElements() as dictionary of CrossFind_OutElementClass
Key=ElementName
CrossFindClass の解析結果。
キーは、
AddModule (CrossFind_ProjectClass)
で追加したモジュール名。
アイテムは、
→ CrossFind_OutElementClass
ソース
→ ToolsLib.vbs
← ▼ ▲
CrossFind_ProjectClass
<< CrossFindClass
→ AddModule
CrossFindClass のプロジェクト。
ソース
→ ToolsLib.vbs
.Name
string
要素の名前
ArrayClass of
CrossFind_ModuleClass
.Modules
モジュールの配列
← ▼ ▲
AddModule (CrossFind_ProjectClass)
Sub CrossFindClass::AddModule( in_ModuleName as string, in_Elements as array of string )
CrossFindClass のプロジェクトにモジュールを追加します。
【引数】
in_ModuleName
モジュール名
in_Elements
モジュールを構成する要素の名前の配列
ソース
→ ToolsLib.vbs
← ▼ ▲
CrossFind_OutElementClass
<< CrossFindClass
CrossFindClass の解析結果。
.Name
.OutModuleTypes
string
CrossFind_OutModuleTypeClass
OutElements (CrossFindClass)
で取得します。
要素の名前
→ CrossFind_OutModuleTypeClass
ソース
→ ToolsLib.vbs
← ▼ ▲
CrossFind_OutModuleTypeClass
CrossFindClass の解析結果。
.Names
.Elements
ArrayClass of string
ArrayClass of string
で取得します。
同じ構成要素を持つモジュールの名前の配列
(CrossFind_OutElementClass)
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）が既存なので
（既存の異なる２つのモジュールをクロスするので）
すべての要素を含むモジュールを見つける
=> { a1, a2 }, { a1, b1 }
=> { a1, b1 }
a3 を除いたのが { a1, b1 } でないときは、すべて追加する
a1 => { a1, a2 }
a2 => { a1, a2 }
a3 =>
新規 (a3) を除いたのが一部のときは、
（{ a1, a3 } については、）
Module を追加する
{ a1, a3 }
{ a1, a3 }
<< CrossFindClass
← ▼ ▲
並べ替え、ソート
← ▼ ▲
QuickSort
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)
→ ArrayToNameOnlyClassArray
→ T_QSort.vbs
関連
→ QuickSort_fromDic
ソース
→ vbslib.vbs
出力
1,3,4,4,6
→ QuickSortDicByKey
← ▼ ▲
ShakerSort
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)
→ シェーカーソート (ShakerSort)
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)
→ ArrayToNameOnlyClassArray
→ T_ShakerSort.vbs
関連
→ ShakerSort_fromDic
→ ShakerSort_fromDicKey
→ ShakerSortDicByKey
→ ShakerSortDicByKeyCompare
← ▼ ▲
CompareFunction 型、比較関数型
Function CompareFunction( Left as variant, Right as variant, Parameter as variant ) as integer
２つのパラメーターを比較する関数の型。 関数名は、CompareFunction とは限りません。
【引数】
Left
Right
１つ目の比較対象
２つ目の比較対象
Parameter
比較に使う補助パラメーター
返り値
０：等しい、正の数：Left が大きい、負の数：Rightが大きい （昇順：小→大のとき）
StrComp
も、この関数型ですが、GetRef("StrComp") はエラーになります。
ShakerSort
Left、Right は、
などの関数に指定するコレクションの要素です。
Param には、ShakerSort などの関数にある引数がそのまま渡ります。
昇順：小→大にするときは、Left - Right の値を返してください。
降順にするときは、返り値の正と負を変えてください。
→ StdCompare
関連
→ NameCompare
→ LengthCompare
→ LengthNameCompare
→ StrCompOption
Function SampleStaticClass_comparePriority( in_Left, in_Right, in_Parameter )
SampleStaticClass_comparePriority = in_Left.Priority - in_Right.Priority
End Function
サンプル
→ CopyFunction 型、コピー関数型
← ▼ ▲
StdCompare
Function StdCompare( Left as variant, Right as variant, Param as variant ) as integer
２つのパラメーターを標準的な方法で比較します。 (StdCompare = Standard Compare)
Left
Right
返り値
比較関数型
です。
数値
数値
-1, 0, 1 のどれか。（＝や＞と同じ）
文字列
文字列
StrComp と同じ （＝や＞と同じ）。Param 引数も同じ
オブジェクト
オブジェクト
is 演算子
の結果が 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
ソース
← ▼ ▲
NameCompare
Function NameCompare( Left as variant, Right as variant, Param as variant ) as integer
２つのパラメーターを Name プロパティで比較します。
Left
Right
返り値
比較関数型
です。
オブジェクト
オブジェクト
Name プロパティを StrComp に渡した結果
オブジェクト以外
オブジェクト以外
0
オブジェクト以外
オブジェクト
-1 （昇順でソートすると、オブジェクト以外が最後になる）
オブジェクト
オブジェクト以外
1
テスト
→ T_QSort.vbs # [T_CompareFunc]
Param 引数は、StrComp 関数と同じです。
→ vbslib.vbs
ソース
← ▼ ▲
NumStringCompare
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）、マイナスとは見なさない
関連
→ shlwapi.dll の StrCmpLogicalW
テスト
→ T_QSort.vbs
→ NumStringNameCompare
T_NumStringCompare
Param 引数には、Empty または
c.CaseSensitive
を指定してください。
ファイル名でソート
したときと同じになります。 ただし、フォルダーの区切り記号 \ や / を含む文字列
を比較するときは、
PathCompare
を使ってください。
→ vbslib.vbs
ソース
10.10 は小数ではなく、バージョン番号のように 10 の 10 であるとします。
←
↓