(for Internet Explorer)
← ▼ ▲
↑
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 であるとします。
← ▼ ▲
NumStringNameCompare
Function NumStringNameCompare( Left as variant, Right as variant, Param as variant ) as integer
Name プロパティの文字列の中の数字を複数桁の正の整数値として比較します。
比較関数型
です。
→ NumStringCompare
参考
(src)
テスト
→ T_QSort.vbs
T_NumStringNameCompare
比較する処理の詳細
Param 引数には、Empty または
c.CaseSensitive
を指定してください。
→ vbslib.vbs
ソース
←
↓