Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
622 views
in Technique[技术] by (71.8m points)

vbscript - Compare values of two arrays - classic asp

How can I Compare values of two arrays to check if 1 array does not have an element of another array for example -

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

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

I want to return the values that are not present in the second array? I tried with double for loops but didn't work out to well for me.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This function:

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 AB (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) AB
         dicI( vItem ) = 0 ' goes into INT
         dicAB.Remove vItem ' and must be removed from AB
      Else ' B item not fount in (current) AB
         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 AB to INT
      End If
  Next
  diffArray = Array( dicU.Keys, dicI.Keys, dicAB.Keys, dicBA.Keys )
End Function

avoids the N*N loopings of D-Money's proposal. (BTW: The fact that in VBScript you specify the size of an array by giving its UBound (last index) may surprise users of other languages, but that does not justify code that fails if arrays don't have spurious tails.)

Code to demonstrate that function:

  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 "AB:", Join( aRes( 2 ) ), "in A but not in B"
  WScript.Echo "BA:", Join( aRes( 3 ) ), "in B but not in A"

Output:

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
AB: 85 in A but not in B
BA: 4711 in B but not in A

For another sample use, see this question.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...