Сравнение двух массивов разной размерностью

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
1
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 10.07.2003 (Чт) 7:07

Сравнение двух массивов разной размерностью

Сообщение 1 » 04.07.2005 (Пн) 15:18

Есть два массива:

varX и varY

varX = 1,2,3,4,5,6,7,8,15
varY = 1,5,9,15,25,64,117


Необходимо сравоить эти два массива и в переменную записать те элементы, которые есть во втором массиве (varY), и которых нет в первом (varХ).

Т.е. должно получиться varZ = 9,25,64,117.

Код: Выделить всё
    Dim varX As Variant
    Dim varY As Variant
    Dim varZ As Variant
    Dim intI As Integer
    Dim intJ As Integer

    For intI = 0 To UBound(varX)
        For intJ = 0 To UBound(varY)
            If varX(intI) <> varY(intJ) Then
                varZ = varZ & ";" & varY(intJ)
            End If
        Next intJ
     Next intI


Получаются многочисленные повторения. Подскажите как правильно реализовать.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.07.2005 (Пн) 15:26

Код: Выделить всё

dim c as collection, i as long
...

set c=new collection
on error resume next
for i=lbound(vary) to ubound(vary)
  c.add clng(vary(i)), cstr(vary(i))
next
for i=lbound(varx) to ubound(varx)
  c.remove cstr(varx(i))
next
on error goto 0

for i=1 to c.count
  msgbox c(i)
next
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.07.2005 (Пн) 15:29

Если массивы отсортированы (по крайней мере varY), то можно так:

Код: Выделить всё
    For intI = 0 To UBound(varX)
        intJ = 0
        While varY(intJ) <= varX(intI)
            If varX(intI) <> varY(intJ) Then
                varZ = varZ & ";" & varY(intJ)
            End If
            intJ = intJ + 1
        Wend
     Next intI


Но можно еще что-нибудь придумать.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 04.07.2005 (Пн) 15:35

Код: Выделить всё
Dim varX As String
Dim varY As String
Dim varZ As String
Dim ArrX() As String
Dim ArrY() As String
Dim ResultArr() As String
Dim i As Integer
Dim j As Integer

varX = "1,2,3,4,5,6,7,8,15"
varY = "1,5,9,15,25,64,117"
varZ = ""

ArrX = Split(varX, ",")
ArrY = Split(varY, ",")

j = UBound(ArrY)
For i = 0 To j
    If InStr(1, "," & varX & ",", "," & CStr(ArrY(i)) & ",") = 0 Then
        If Len(varZ) > 0 Then
            varZ = varZ & "," & ArrY(i)
        Else
            varZ = ArrY(i)
        End If
    End If
Next i

'varZ = 9,25,64,117

MsgBox varZ

1
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 10.07.2003 (Чт) 7:07

Сообщение 1 » 04.07.2005 (Пн) 15:53

Всем спасибо.

GSerg, вариант с коллекцией работает как часы. Я тоже уже хотел сделать через коллекцию, но не смог подкопаться.

Antonariy, твой вариант как-то не корректно отрабатывает.
Получаются такой результат: 1;1;1;1;1;5;1;5;1;5;1;5;9

Konst_One, твой вариант тоже работает как необходимо.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 63

    TopList