2015-06-22 129 views
-1

我需要一種方法來比較vb.net兩個數組並保存導致第三組:與數字比較陣列在vb.net

Dim KonRes(3) As Integer 
Dim UserRes(3) As Integer 
Dim YelRed(3) As Integer 

KonRes(0) = 1 
KonRes(1) = 2 
KonRes(2) = 3 
KonRes(3) = 4 

UserRes(0) = 4 
UserRes(1) = 3 
UserRes(2) = 2 
UserRes(3) = 1 

所以在聲明的變量如何將這些陣列比較YelRed我應該有這樣的結果:

If UserRes(0) = KonRes(0) Then 
YelRed(0) = 2 
If UserRes(0) = KonRes(1 or 2 or 3) Then 
YelRed(0) = 1 

如果UserRes(0)不包含任何數量的像KonRes然後YelRed(0)應爲0。此外,它不應該重複的結果,換句話說,如果它已經檢查UserRes(0)= Kon Res(0)那麼它不應該在下次檢查時檢查KonRes(0)。如果這些數組完全相同,比較是不是問題,我的問題是將一個數組的每個值與另一個數組進行比較,並收集結果。有什麼建議麼?

+0

你沒有說預期的結果是什麼。如果數字不在第二個數組中,則要存儲0,但如果數字在那裏,您想存儲什麼?預期結果:如果UserRes(0)= KonRes(0)表示它們在兩個數組中的位置相同,則YelRed(0)= 2,如果數組不包含重複項,則可以使用'HashSet(Of Int32)' –

+0

UserRes(0)= KonRes(1,2,3)所以編號在那裏,但不在同一位置,所以YelRed(0)= 1,如果編號不在secod數組中。 –

+0

對於重複的結果條件,它是否應該僅在設置爲2時才檢查KonRes(0)(如果它設置爲1,那麼它應該如何)?目前的答案都沒有檢查這一點。 – Sastreen

回答

2

檢查整數數組中的值有幾種基本方法。首先是通過循環數組中的每個值來手動搜索,如果需要進行復雜的比較,這可能是您想要的。

其次是.Contains()方法。它使用起來更簡單,但只會給你一個布爾值,指示值是否在數組中。例如:

If KonRes.Contains(UserRes(0)) Then YelRed(0) = 1 

最後,還有IndexOf()函數。它搜索匹配並返回匹配的索引(如果找到),或者返回低於數組下限(如果不存在)(對於典型的基於0的數組,則爲-1)。據我瞭解你的需求,從你的上述評論,這段代碼應該做的伎倆:

For i As Integer = 0 To 3 
    Select Case IndexOf(KonRes, UserRes(i)) 
     Case i 'Matching postion 
      YelRed(i) = 2 
     Case -1 'No match found 
      YelRed(i) = 0 
     Case Else 'Match found at another position 
      YelRed(i) = 1 
    End Select 
Next i 

編輯:我誤解了關於重複的資格,直到@Sastreen澄清它。下面是針對不計相同的索引匹配兩次改寫:

Dim processed(3) As Boolean 
For i As Integer = 0 To 3 
    YelRed(i) = 0 
    If KonRes(i) = UserRes(i) And Not processed(i) Then 
     processed(i) = True 
     YelRed(i) = 2 
    Else 
     For j As Integer = 0 To 3 
      If KonRes(j) = UserRes(i) Then 
       processed(j) = True 
       YelRed(i) = 1 
       Exit For 
      End If 
     Next j 
    End If 
Next i 
+0

這並不能確保它不會返回「重複」,如問題所述。 – Sastreen

+0

好的工作與修復重複!我認爲這就是他想要的。這就是爲什麼我在開始時使用了兩個for循環(我認爲使用IndexOf很難做到這一點)。 – Sastreen

+0

是的。我並不是100%肯定的,我完全理解他最初要求的一切,這就是爲什麼我提到手動循環數組可能是進行更復雜的比較的最佳選擇。根據我對問題的最初理解,IndexOf更清晰,但是一旦澄清,就會不必要地複雜代碼。我仍然想解釋所有的選擇,因爲人們會再次有這個問題,並找到這個答案,其中許多人可能會有比達利博爾稍有不同的需求。 – Josh

1

如果UserRes(0) = KonRes(0)意味着它們在相同的位置以兩種 陣列,然後YelRed(0) = 2,如果UserRes(0) = KonRes(1,2,3)所以數是 那裏,但不是在同一位置,所以YelRed(0) =1和如果該號碼 不在第二陣列它必須爲0

使用For -loop:

For i As Int32 = 0 To KonRes.Length - 1 
    If KonRes(i) = UserRes(i) Then 
     ' Same position ' 
     YelRed(i) = 2 
    ElseIf UserRes.Contains(KonRes(i)) Then 
     ' Other position ' 
     YelRed(i) = 1 
    Else 
     ' Not contained ' 
     YelRed(i) = 0 
    End If 
Next 
+0

我不確定這是否確保它不會返回「重複」,如問題所述。 – Sastreen

+0

@Sastreen:什麼樣的重複?它只是循環「KonRes」數組。我想這只是一個語言問題,OP並不意味着_duplicates_,而是避免多次使用相同的數組索引。 'UserRes.Contains'檢查兩次相同的數組索引,但這根本不是問題,因爲我使用了'ElseIf'。 –

+0

據我瞭解(可能是錯誤的),如果UserRes具有值(1,1,2,2)和KonRes(1,1,3,2),那麼它應該返回(2,2,1,0),不是(2,1,1,2)。所以第二個值1會在KonRes中找到第二個索引1,而不是第一個索引(就像一個包含的那樣)。 – Sastreen

1

呦您可以使用嵌套的For循環來通過兩個陣列進行比較,然後使用Exit For隨時離開。

indicesToIgnore用於確保它不會「產生重複結果」(使用IndexOfcontains方法很難實現)。

此外,如果它已經被選中UserRes(0)= KonRes(0),那麼它應該不是(0)在下次檢查檢查KonRes它不應該做重複的結果,換句話說。

Dim indicesToIgnore as New List(Of Integer) 

'go through first array 
For i as Integer = 0 to UserRes.length - 1 Step 1 
    'go through second array 
    For j as Integer = 0 to KonRes.length- 1 Step 1 
     'if the values are equal, check whether same index, then exit for 
     If (Not indicesToIgnore.contains(j) AndAlso UserRes(i) = KonRes(j)) Then 
      If i=j Then 
       YelRed(i) = 2 
       indicesToIgnore.add(j) 
      Else 
       YelRed(i) = 1 
      End If 
     Exit For 
     End If 
    Next 
Next 

你並不需要設置YelRed(i) 0在任何時間,因爲它默認爲這一點。您只需確保YelRed與其他陣列具有相同的大小。

如果你也希望它不看KonRes值(一式兩份),如果它包含它在不同的指數,只需在Else的末尾添加indicesToIgnore.add(j)YelRed(i) = 1後)爲好。

0

我認爲這將做的工作,如果KonRes(0)= UserRes(0),那麼YelRed(0)= 1,否則YelRed( 0)= 2

Dim KonRes(3) As Integer 
    Dim UserRes(3) As Integer 
    Dim YelRed(3) As Integer 

    KonRes(0) = 1 
    KonRes(1) = 2 
    KonRes(2) = 3 
    KonRes(3) = 4 

    UserRes(0) = 4 
    UserRes(1) = 2 
    UserRes(2) = 2 
    UserRes(3) = 1 

    Dim Uindex As Integer = 0 
    For Each item In UserRes 
     Dim Kindex As Integer = 0 
     For Each i In KonRes 
      If item = i Then 
       If Kindex = Uindex Then 
        YelRed(Uindex) = 1 
       Else 
        YelRed(Uindex) = 2 
       End If 
      End If 
      Kindex += 1 
     Next 
     Uindex += 1 
    Next 
0

你沒有告訴我們輸出應該是什麼。這有點令人困惑。就我而言,它將是{1,1,0,0}。如果是用2 for循環完成。在那個循環中,KonRes中的所有內容都只在UserRes中循環。

For k As Integer = 0 To KonRes.Length - 1 
     If KonRes(k) = UserRes(k) Then 
      YelRed(k) = 2 
     Else 
      YelRed(k) = 0 

      For u As Integer = k + 1 To UserRes.Length - 1 
       If KonRes(k) = UserRes(u) Then 
        YelRed(k) = 1 
        Exit For 
       End If 
      Next 
     End If 
    Next 
0

您可以使用數組中的比較。

昏暗iNextActivityTypeCd爲整數= 18400個 昏暗活動()爲整數= {1,18400,2300,3423}

如果activities.Contains(iNextActivityTypeCd)然後 昏暗富= 1 結束如果