C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

配列内の重複除去した配列と重複していた値の配列の取得

CATIA V5と言うよりVBAです。

タイトルが分かりにくいのですが、重複した値を持つ配列があります。
そこから重複を除去した配列を取得しつつ、重複した値が何か? も
取得したいので、わがままな関数を作りました。

'vba 配列の重複削除のわがまま仕様

Option Explicit

Sub CATMain()
    
    Dim ary As Variant
    ary = Array(3, 1, 2, 4, 4, 3, 2, 2, "A", "B", "A")
    
    Dim resultArray As Variant
    resultArray = get_remove_duplicates_array(ary)
    
    dump_array resultArray(0)
    dump_array resultArray(1)

End Sub


' 配列の重複削除
' return array(array,array) - 0:重複無し配列, 1:重複した配列
Private Function get_remove_duplicates_array( _
    ByVal ary As Variant) _
    As Variant

    Dim dict_unique As Object
    Set dict_unique = CreateObject("Scripting.Dictionary")

    Dim dict_duplicates As Object
    Set dict_duplicates = CreateObject("Scripting.Dictionary")
    
    Dim i As Long
    Dim value As Variant
    For i = 0 To UBound(ary)
        value = ary(i)

        If Not dict_unique.exists(value) Then
            dict_unique.Add value, 0
            GoTo continue
        End If
        
        If Not dict_duplicates.exists(value) Then
            dict_duplicates.Add value, 0
            GoTo continue
        End If
        
continue:
    Next
    
    get_remove_duplicates_array = Array( _
        dict_unique.keys(), _
        dict_duplicates.keys() _
    )

End Function


Private Sub dump_array( _
    ByVal ary As Variant)
    
    Debug.Print "*****"
    Dim i As Long
    For i = 0 To UBound(ary)
        Debug.Print ary(i)
    Next
End Sub

実行結果はこんな感じです。

*****
 3 
 1 
 2 
 4 
A
B
*****
 4 
 3 
 2 
A

先の出力が重複無しで、後が重複していた値です。

・・・えぇ分かってます。本来であれば
重複除去の関数と重複している値のみを返す関数の二つ作るべきだと。