Сравнение элементов в многомерном массиве - PullRequest
0 голосов
/ 21 ноября 2018

Предположим, у меня есть массив измерений comb(x, y).
Для каждого элемента x мне нужно проверить, идентичны ли какие-либо элементы y.Если это так, я перейду к следующему элементу x.

Если бы в y было 4 элемента для каждого x, то код, который я использовал бы, был бы примерно таким:

For i = 0 To z
    j = 0
    k = j + 1
    l = j + 2
    m = j + 3

    If comb(i, j) <> comb(i, k) And _
    comb(i, j) <> comb(i, l) And _
    comb(i, j) <> comb(i, m) And _
    comb(i, k) <> comb(i, l) And _
    comb(i, k) <> comb(i, m) And _
    comb(i, l) <> comb(i, m) Then

       MsgBox "success"

    End If

 Next i

Дело в том, что размерность y изменяется в зависимости от ввода пользователя.
Есть ли способ автоматизировать его для произвольного числа элементов в y?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

С большой помощью К.Дависа я нашел следующее решение моей проблемы:

For x = LBound(comb, 1) To UBound(comb, 1)
   For y = LBound(comb, 2) To UBound(comb, 2) - 1
      For z = y + 1 To UBound(comb, 2)
         If comb(x, y) = comb(x, z) Then
            noMatch = True
         End If
      Next z
   Next y

   If noMatch = False Then
      MsgBox x
   End If

   noMatch = False

Next x
0 голосов
/ 21 ноября 2018

Вы можете создать три цикла, которые будут проверять каждое значение, но будут пропускать друг друга из-за того, что последний цикл будет y + 1 из второго цикла.

Dim x As Long, y As Long, z As Long, comb()

For x = LBound(comb, 1) To UBound(comb, 1)
    For y = LBound(comb, 2) To UBound(comb, 2) - 1
        For z = y + 1 To UBound(comb, 2)
            If comb(x, y) = comb(x, z) Then
                msgbox "Match Occurred!"
            End If
        Next z
    Next y
Next x

По сути, второй цикл контролируетлевая часть уравнения (If comb(x, y) = и 3-й цикл управляют правой стороной (= comb(x, z)).


При желании, чтобы избежать ошибок, когда в единственном значении может быть только одно значениеВо втором измерении вы можете добавить дополнительный оператор If..Then , например:

If Lbound(comb, 2) <> Ubound(comb, 2) Then ...

, в связи с тем, как третий цикл добавляет 1 к значению y,но возникнет ошибка, если не будет добавлено 1 к y.


Визуализация

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

Sub test()

    Dim x As Long, y As Long, z As Long, comb(0, 0 To 4)

    For x = LBound(comb, 1) To UBound(comb, 1)
        For y = LBound(comb, 2) To UBound(comb, 2) - 1
            For z = y + 1 To UBound(comb, 2)
                If comb(x, y) = comb(x, z) Then
                    Debug.Print y & "|" & z
                End If
            Next z
        Next y
    Next x

End Sub

, которое выводит непосредственное окно:

0|1  
0|2  
0|3  
0|4  
1|2  
1|3  
1|4  
2|3  
2|4  
3|4  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...