我如何比較兩個數組的值,以檢查是否1個陣列沒有另一個數組例如一個元素 - 我要回屬於價值比較值 - 傳統的ASP
array1(0) = 85
array1(1) = 459
array1(2) = 90
array2(0) = 459
array2(1) = 90
不存在於第二個數組中?我嘗試了雙循環,但對我來說並沒有很好的解決。
我如何比較兩個數組的值,以檢查是否1個陣列沒有另一個數組例如一個元素 - 我要回屬於價值比較值 - 傳統的ASP
array1(0) = 85
array1(1) = 459
array1(2) = 90
array2(0) = 459
array2(1) = 90
不存在於第二個數組中?我嘗試了雙循環,但對我來說並沒有很好的解決。
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
下面是一個提供多種比較方式的例子 - 也有一個很好的演示。
http://www.aspkey.net/aspkey/_articles/asp/showarticle.asp?id=110
應該有一個反對(VBScript)代碼包含可憎的代碼如'if found =「false」的法律,然後' –
此功能:
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。
這是一個非常優雅的解決方案。非常感謝 – Simon
作品完美謝謝 –