2015-06-22 70 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 结束如果