|
Zur Ermittlung von Schnittmengen und Differenzmengen zweier String- oder Zahlen-Collections eignet sich am besten das Verfahren, die Elemente der einen Collection unter ihrem Wert als Schlüssel in die andere einzufügen. Voraussetzung ist dabei natürlich, dass die Elemente der zweiten Collection bereits unter ihrem Wert als Schlüssel eingefügt worden sind. Schlägt der Einfüge-Versuch für ein Element fehl, ist das Element bereits in der anderen Collection vorhanden - und somit in beiden Collections gemeinsam. Es wird somit in eine dritte Collection (Schnittmenge) aufgenommen.
Die folgende Prozedur liefert Ihnen nach diesem Verfahren die Schnittmenge zweier String-Collections, die im Parameter CollCommon zurückgegebenen wird.
Public Sub CollCommonStr(Coll1 As Collection, Coll2 As Collection, _
CollCommon As Collection)
Dim l As Long
Dim nItem As String
Set CollCommon = New Collection
CollCommon.Add ""
On Error Resume Next
For l = Coll2.Count To 1 Step -1
nItem = Coll2(l)
nItem = Coll1(nItem)
If Err.Number Then
Err.Clear
Else
CollCommon.Add nItem, , 1
End If
Next 'l
With CollCommon
.Remove .Count
End With
End Sub
Brauchen Sie dagegen bzw. darüber hinaus auch die beiden verbleibenden Restmengen, die verbleibenden Elemente in den beiden Collections, nachdem die gemeinsamen Elemente entfernt wurden, erledigt dies die folgende Prozedur.
Public Sub CollDiffStr(Coll1 As Collection, Coll2 As Collection, _
CollCommon As Collection)
Dim l As Long
Dim nItem As String
Set CollCommon = New Collection
CollCommon.Add ""
On Error Resume Next
For l = Coll2.Count To 1 Step -1
nItem = Coll2(l)
nItem = Coll1(nItem)
If Err.Number Then
Err.Clear
Else
Coll1.Remove nItem
CollCommon.Add nItem, , 1
Coll2.Remove nItem
End If
Next 'l
With CollCommon
.Remove .Count
End With
End Sub
Beachten Sie bitte, dass die Inhalte der beiden übergebenen Collections geändert werden, und dass vor der Übergabe die in Coll1 enthaltenen Elemente mit ihrem Wert als Schlüssel eingefügt worden sein müssen. Beispiel:
Dim Coll1 As Collection
...
Coll1.Add "A", "A"
Coll1.Add "B", "B"
Sollen die beiden Ausgangs-Collections jedoch unberührt bleiben, und sollen in ihnen die Elemente mit anderen beliebigen oder auch gar keinen Schlüsseln eingefügt worden sein, können Sie die dritte Variante, die Prozedur CollDiffStr verwenden. Sie überführt die vorhandenen Collections zunächst in weitere Collections, die dann wie oben bearbeitet werden. Sie können hierbei auch Collections einsetzen, in denen Elemente mehrfach vorkommen können. Die Ergebnis-Collections liefern allerdings jedes Element nur höchstens einmal.
Public Sub CollDiffStr(Coll1 As Collection, Coll2 As Collection, _
Coll1Unique As Collection, Coll2Unique As Collection, _
CollCommon As Collection)
Dim l As Long
Dim nItem As String
Set Coll1Unique = New Collection
With Coll1Unique
For l = 1 To Coll1.Count
nItem = Coll1(l)
.Add nItem, nItem
Next 'l
End With
Set Coll2Unique = New Collection
With Coll2Unique
For l = 1 To Coll2.Count
nItem = Coll2(l)
.Add nItem
Next 'l
End With
Set CollCommon = New Collection
CollCommon.Add ""
On Error Resume Next
For l = Coll2Unique.Count To 1 Step -1
nItem = Coll2Unique(l)
nItem = Coll1Unique(nItem)
If Err.Number Then
Err.Clear
Else
Coll1Unique.Remove nItem
CollCommon.Add nItem, , 1
Coll2Unique.Remove l
End If
Next 'l
With CollCommon
.Remove .Count
End With
End Sub
Wollen Sie Collections anderer Datentypen vergleichen, können Sie die drei oben stehenden Prozeduren im Prinzip auch dafür verwenden. Der einzige Unterschied ist, dass bei der Verwendung des jeweiligen Element-Werts als Schlüssel der Wert explizit in einen String-Schlüssel konvertiert werden sollte. Bei Collections, die ganzzahlige Werte enthalten, muss der Schlüssel-Wert sogar ausdrücklich in einen String-Schlüssel konvertiert werden. Als Beispiel sehen Sie nachfolgend die Abwandlung der dritten der oben stehenden Versionen für Long-Collections.
Public Sub CollDiff2Lng(Coll1 As Collection, Coll2 As Collection, _
Coll1Unique As Collection, Coll2Unique As Collection, _
CollCommon As Collection)
Dim l As Long
Dim nItem As Long
On Error Resume Next
Set Coll1Unique = New Collection
With Coll1Unique
For l = 1 To Coll1.Count
nItem = Coll1(l)
.Add nItem, CStr(nItem)
Next 'l
End With
Set Coll2Unique = New Collection
With Coll2Unique
For l = 1 To Coll2.Count
nItem = Coll2(l)
.Add nItem, CStr(nItem)
Next 'l
End With
Set CollCommon = New Collection
CollCommon.Add ""
For l = Coll2Unique.Count To 1 Step -1
nItem = Coll2Unique(l)
nItem = Coll1Unique(CStr(nItem))
If Err.Number Then
Err.Clear
Else
Coll1Unique.Remove CStr(nItem)
CollCommon.Add nItem, , 1
Coll2Unique.Remove l
End If
Next 'l
With CollCommon
.Remove .Count
End With
End Sub
|