我需要一种方法来比较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)= KonRes( 0)然后它不应该在下一次检查中检查KonRes(0)。如果这些数组完全相同,那么比较它不是问题,我的问题是将一个数组的每个值与另一个数组进行比较,并收集结果。有什么建议吗?
答案 0 :(得分: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
答案 1 :(得分:1)
如果
UserRes(0) = KonRes(0)
表示他们在两个人中处于同一位置 数组,然后是YelRed(0) = 2
,如果UserRes(0) = KonRes(1,2,3)
那么数字是 在那里,但不是在同一个位置,所以YelRed(0) =1
和数字 不在第二个数组中,它必须为0。
使用For
- 循环:
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
答案 2 :(得分:1)
您可以使用嵌套的For
循环遍历两个数组进行比较,然后随时使用Exit For
离开。
indicesToIgnore
用于确保它不会“产生重复结果”(使用IndexOf
和contains
方法更难实现。)
此外,它不应该重复结果,换句话说,如果它已经检查了UserRes(0)= KonRes(0),那么它不应该在下一次检查中检查KonRes(0)。
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值(对于重复项),如果它包含不同的索引,只需在indicesToIgnore.add(j)
的末尾添加Else
(在{{1之后)也是。
答案 3 :(得分:0)
我认为如果KonRes(0)= UserRes(0)然后YelRed(0)= 1,那么这将完成工作,否则YelRed(0)= 2
var settings = {
"async": true,
"crossDomain": true,
"url": "http://localhost:1337/person/create",
"method": "POST",
"headers": {
"content-type": "application/json"
},
"data": "{'companyID':'DEV','firstName':'Radha','lastName':'A', 'otherIDs': [123,345] }"
}
$.ajax(settings).done(function (response) {
console.log(response);
});
答案 4 :(得分: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
答案 5 :(得分:0)
您可以使用数组中的比较。
Dim iNextActivityTypeCd As Integer = 18400 Dim activities()As Integer = {1,18400,2300,3423}
如果activities.Contains(iNextActivityTypeCd)则 Dim foo = 1 结束如果