Сравните значения двух массивов - классический asp - PullRequest
3 голосов
/ 06 июля 2011

Как я могу сравнить значения двух массивов, чтобы проверить, нет ли, например, в 1 массиве элемента другого массива -

array1(0) = 85
array1(1) = 459
array1(2) = 90

array2(0) = 459
array2(1) = 90

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

Ответы [ 3 ]

14 голосов
/ 06 июля 2011

Эта функция:

Function diffArray( aA, aB )
  ' !! http://en.wikipedia.org/wiki/Union_%28set_theory%29
  ' The union of two sets A and B is the collection of points which are in A or
  ' in B (or in both)
  Dim dicU : Set dicU = CreateObject( "Scripting.Dictionary" )
  ' !! http://en.wikipedia.org/wiki/Intersection_%28set_theory%29
  ' the intersection of two sets A and B is the set that contains all elements
  ' of A that also belong to B (or equivalently, all elements of B that also
  ' belong to A)
  Dim dicI : Set dicI = CreateObject( "Scripting.Dictionary" )
  ' !! http://en.wikipedia.org/wiki/Complement_%28set_theory%29
  ' If A and B are sets, then the relative complement of A in B, also known as
  ' the set-theoretic difference of B and A, is the set of elements in B, but
  ' not in A. The relative complement of A in B is denoted B \ A
  Dim dicAB : Set dicAB = CreateObject( "Scripting.Dictionary" )
  Dim dicBA : Set dicBA = CreateObject( "Scripting.Dictionary" )
  Dim vItem
  For Each vItem In aA
      dicU(  vItem ) = 0 ' all from A go into UNI (all from B added later)
      dicAB( vItem ) = 0 ' all from A go into A\B (all from B removed later)
  Next
  For Each vItem In aB
      dicU( vItem ) = 0 ' all from B are added to UNI
      If dicAB.Exists( vItem ) Then ' B item found in (current) A\B
         dicI( vItem ) = 0 ' goes into INT
         dicAB.Remove vItem ' and must be removed from A\B
      Else ' B item not fount in (current) A\B
         If Not dicI.Exists( vItem ) Then dicBA( vItem ) = 0 ' goes to B/A if not already in INT
'        dicBA( vItem ) = 0 ' bug: would add item previously removed from A\B to INT
      End If
  Next
  diffArray = Array( dicU.Keys, dicI.Keys, dicAB.Keys, dicBA.Keys )
End Function

позволяет избежать N * N циклов предложения D-Money. (Кстати: тот факт, что в VBScript Вы указываете размер массива, давая его UBound (последний индекс) может удивить пользователи других языков, но это не оправдывает код, который терпит неудачу, если массивы не есть ложные хвосты.)

Код для демонстрации этой функции:

  Dim aA   : aA   = Split( "85 459 90 85" )
  Dim aB   : aB   = Split( "4711 459 90 4711" )
  Dim aRes : aRes = diffArray( aA, aB )
  WScript.Echo "A  :", Join( aA )
  WScript.Echo "B  :", Join( aB )
  WScript.Echo "UNI:", Join( aRes( 0 ) ), "in A or B"
  WScript.Echo "INT:", Join( aRes( 1 ) ), "in A and B"
  WScript.Echo "A\B:", Join( aRes( 2 ) ), "in A but not in B"
  WScript.Echo "B\A:", Join( aRes( 3 ) ), "in B but not in A"

Выход:

A  : 85 459 90 85
B  : 4711 459 90 4711
UNI: 85 459 90 4711 in A or B
INT: 459 90 in A and B
A\B: 85 in A but not in B
B\A: 4711 in B but not in A

Другой пример использования см. в этом вопросе .

3 голосов
/ 06 июля 2011
Dim array1(3)
Dim array2(2)

array1(0) = 85
array1(1) = 459
array1(2) = 90

array2(0) = 459
array2(1) = 90

Dim i 'As Integer
Dim j 'As Integer
Dim isFound 'As Boolean

For i = 0 To UBound(array1) - 1
    isFound = False
    For j = 0 To UBound(array2) - 1
        If array1(i) = array2(j) Then
            isFound = True
        End If
    Next 'j
    If Not isFound Then
        Response.Write array1(i) & " not found<br />"
    End If
Next 'i
0 голосов
/ 06 июля 2011

Вот пример, который предлагает несколько способов сравнения - также есть хорошая демонстрация.

http://www.aspkey.net/aspkey/_articles/asp/showarticle.asp?id=110

...