Удалить обратные дубликаты из массива VBA - PullRequest
0 голосов
/ 28 октября 2019

Мне нужно удалить обратные дубликаты из массива.

Из 1,2 и 2,1 Я хочу удалить 2,1, поскольку его обратный является дубликатом для 1,2.

Sub go()
    Dim arr() As String
    ReDim Preserve arr(0)

    Dim i, k As Integer

    For i = 1 To 2
        For k = 1 To 10    
            If i <> k Then
                arr(UBound(arr)) = i & "," & k
                ReDim Preserve arr(UBound(arr) + 1)
            End If
        Next
    Next
    'Debug.Print Join(arr, vbCrLf)

    For z = 0 To UBound(arr)
        For q = 0 To UBound(arr)    
            rev = StrReverse(arr(z))
            If arr(q) = rev Then
                Debug.Print arr(z) & "-" & rev
            End If
        Next
    Next
End Sub

1 Ответ

0 голосов
/ 28 октября 2019

Как сказано в комментариях, самый простой способ сделать это - иметь новый массив и добавлять к нему элементы. Также, как сказал Хель О'Вин, переменные VBA нуждаются в явных объявлениях, как у меня ниже.

Public Sub goTest()

Dim inputArray() As String
ReDim Preserve inputArray(0)
Dim resultArray() As String
ReDim Preserve resultArray(0)

Dim i As Long, j As Long
Dim rev As String, notDuped As Boolean

'[[-- Loop to generate the test array
For i = 1 To 2
    For j = 1 To 10
        If i <> j Then
            inputArray(UBound(inputArray)) = i & "," & j
            ReDim Preserve inputArray(UBound(inputArray) + 1)
        End If
    Next j
Next i
'--]]

'The actual reverse removed code
For i = 0 To UBound(inputArray)
    rev = StrReverse(inputArray(i))
    notDuped = True
    For j = 0 To i 'Only loop up to the current point, not all of the array
        If inputArray(j) = rev Then
            notDuped = False
            Exit For
        End If
    Next j
    If notDuped Then 'If no reverse found add to new array
        resultArray(UBound(resultArray)) = inputArray(i)
        ReDim Preserve resultArray(UBound(resultArray) + 1)
    End If
Next i

'[[-- To check that it worked
For i = 0 To UBound(resultArray)
    Debug.Print (resultArray(i))
Next i
'--]]

End Sub

В нижней части кода просто выводится результирующий массив, так что вы можете видеть, что он не имеет обращений, он не имеет никакого отношенияна код работает правильно.

Если у вас есть какие-либо проблемы с этим, просто оставьте мне комментарий, и я свяжусь с вами.

...