2011-07-06 74 views
2

我如何比較兩個數組的值,以檢查是否1個陣列沒有另一個數組例如一個元素 - 我要回屬於價值比較值 - 傳統的ASP

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

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

不存在於第二個數組中?我嘗試了雙循環,但對我來說並沒有很好的解決。

回答

2
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

作品完美謝謝 –

13

此功能:

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 

避免d-Money的建議的N * N環圈。 (順便說一句:在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 

對於另一個樣品用途,參見this question

+2

這是一個非常優雅的解決方案。非常感謝 – Simon