我有一个整数数组,我需要知道最大数字的索引(不是实际值,只是最高的索引)。
但是,如果一个或多个索引“绑定”最高值,我需要拥有共享该高值的所有索引。
我认为这个函数需要返回一个数组(因为它可能是一个或多个索引),但我不完全确定如何获得更高效的解决方案。
答案 0 :(得分:2)
如果这是一个常见的事情,你可以编写自己的扩展。你应该添加一些额外的健全/空检查,但这会让你开始:
Module Extensions
<System.Runtime.CompilerServices.Extension()> Function FindAllIndexes(Of T)(ByVal array() As T, ByVal match As Predicate(Of T)) As Integer()
''//Our return object
Dim Ret As New List(Of Integer)
''//Current array index
Dim I As Integer = -1
''//Infinite loop, break out when we no more matches are found
Do While True
''//Loop for a match based on the last index found, add 1 so we dont keep returning the same value
I = System.Array.FindIndex(array, I + 1, match)
''//If we found something
If I >= 0 Then
''//Append to return object
Ret.Add(I)
Else
''//Otherwise break out of loop
Exit Do
End If
Loop
''//Return our array
Return Ret.ToArray()
End Function
End Module
然后调用它:
Dim ints As Integer() = New Integer() {1, 2, 8, 6, 8, 1, 4}
Dim S = ints.FindAllIndexes(Function(c) c = ints.Max())
''//S now holds 2 and 4
答案 1 :(得分:0)
如果您使用的是.NET 3.5,则可以使用Max()扩展功能轻松找到最高值,并使用“在何处找到源阵列中的匹配记录”。
答案 2 :(得分:0)
IList有一个IndexOf成员,这有帮助。此代码完全未经测试,可能至少有一个一个一个错误。
Public Function GetPostionsOfMaxValue(ByVal input() As Integer) As Integer()
Dim ints = New List(Of Integer)(input)
Dim maxval = ints.Max
Dim indexes As New List(Of Integer)
Dim searchStart As Integer = 0
Do Until searchStart >= ints.Count
Dim index = ints.IndexOf(maxval, searchStart)
If index = -1 Then Exit Do
indexes.Add(index)
searchStart = index + 1
Loop
Return indexes.ToArray
End Function