2011-05-24 32 views
1

我有一個整數數組,我需要知道最大數字的索引(不是實際值,只是最高的索引)。獲取數組中最大整數的索引

但是,如果一個或多個索引「綁定」最高值,我需要擁有所有分享該高價值的索引。

我認爲這個函數需要返回一個數組(因爲它可能是一個或多個索引),但我不完全知道如何去獲得更高效的解決方案。

回答

2

如果這將是一件普通的事情,您可以編寫自己的擴展。你應該添加一些額外的理智/ null的檢查,但是這將讓你開始:

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 
+0

這工作像一個魅力。謝謝! – 2011-05-24 22:01:25

0

如果您使用的是.NET 3.5,則可以使用Max() Extension函數輕鬆找到最高值,並使用Where在您的源陣列中找到匹配記錄。

+0

但是,這隻會得到一個也是最大的。我的功能最大。此外,Max()來自.net 3.5 – 2011-05-24 18:38:15

+0

我在編輯我的答案,以糾正它,而你輸入你的評論:) – davisoa 2011-05-24 18:39:44

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