2014-01-28 74 views
0

最近,當我的客戶端創建一個程序作爲我的計算項目的一部分,在visual basic .net中,我遇到了一個問題,看起來像下面;爲了獲得我的程序額外的標記,我必須利用遞歸聲明的二進制搜索或插入排序子例程,到目前爲止我唯一可以使用它的地方是我的查看錶單,它顯示所有由程序生成的報告,但是這是因爲我使用MS Access來存儲我的數據,所有的數據都被下載並放置在窗體的load部分的listview中。所以我可以使用它的唯一方法是通過在listview上運行它,這對我來說是一個主要問題,因爲我對vb不是很有經驗。二進制搜索或插入與列表視圖排序[Visual Basic .net]

對於二分法搜索,我已經嘗試將用戶列中指定的所有項目下載到數組中,但這是我最困難的一點,因爲我無法將只有一列的所有項目下載到數組中。而不是搜索每一個列用戶在我的表單中指定哪個列項目所在的位置(例如「19/02/2013」​​在「日期」列中),在我看來,如果我設法將指定列中的每一個條目下載到一個數組,它應該允許我稍後運行二分搜索,因此完成算法。這是迄今爲止我所擁有的。

Sub BinarySearch(ByVal Key As String, ByVal lowindex As String, ByVal highindex As String, ByVal temp() As String) 
    Dim midpoint As Integer 

    If lowindex > highindex Then 
     MsgBox("Search Failed") 
    Else 
     midpoint = (highindex + lowindex)/2 
     If temp(midpoint) = Key Then 
      MsgBox("found at location " & midpoint) 
     ElseIf Key < temp(midpoint) Then 
      Call BinarySearch(Key, lowindex, midpoint, temp) 
     ElseIf Key > temp(midpoint) Then 
      Call BinarySearch(Key, midpoint, highindex, temp) 
     End If 
    End If 
End Sub 

Private Sub btnSearch_Click(sender As System.Object, e As System.EventArgs) Handles btnSearch.Click 
    Dim Key As String = txtSearch.Text 
    Dim TargetColumn As String = Me.lstOutput.Columns(cmbColumns.Text).Index 
    Dim lowindex As Integer = 0 
    Dim highindex As Integer = lstOutput.Items.Count - 1 
    'Somehow all of the items in Target column must be placed in temp array 
    Dim temp(Me.lstOutput.Items.Count - 1) As String 

    ' BinarySearch(Key, lowindex, highindex, temp) 
End Sub 

插入排序我甚至沒有一個線索如何開始,事情是,我必須使用的,而不是調用系統庫,將做到這一點對我來說我自己的子程序。 代碼,我不得不使用看起來像以下:

Private Sub InsertionSort() 
Dim First As Integer = 1 
Dim Last As Integer = Me.lstOutput. 
Dim CurrentPtr, CurrentValue, Ptr As Integer 
For CurrentPtr = First + 1 To Last 
CurrentValue = A(CurrentPtr) 
Ptr = CurrentPtr - 1 
While A(Ptr) > CurrentValue And Ptr > 0 
A(Ptr + 1) = A(Ptr) 
Ptr -= 1 
End While 
A(Ptr + 1) = CurrentValue 
Next 
Timer1.Enabled = False 
lblTime.Text = tick.ToString 
End Sub 

就如何實現這一代碼的任何想法將是非常讚賞,並請繼續保持在我的腦海,我不是在這門語言

+1

那麼,什麼是你真的問這裏?難道你無法從Access表中檢索列並將值存儲在數組中嗎?這是否阻止你從「客戶」那裏獲得「額外的標記」? –

+0

基本上,我一般都在尋求如何在列表視圖中實現這些算法中的一種算法的幫助,或者如何將特定列中的所有數據下載到數組中 – 5m0k3

+1

那不是ListView排序的工作方式,特別是如果它是綁定(如果這是「下載」的含義)。您需要將db數據轉換爲ArrayList,按照這種或那種方式進行排序,然後將結果發佈到ListView。要排序一次它在ListView中,爲了排序一個特定的列,你需要一個自定義的'ListViewSorter',它只提供了項目和項目的比較,LV做了實際的排序。 – Plutonix

回答

0
非常有經驗

也許這可能會給你一個開始的地方。如果您已經有在它的「東西」一個ListView您可以添加一個按鈕的形式用下面的代碼到Text屬性爲每個項目複製到一個數組:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim myArray(Me.ListView1.Items.Count - 1) As String 
    Dim i As Integer 

    ' load array 
    For i = 0 To Me.ListView1.Items.Count - 1 
     myArray(i) = Me.ListView1.Items(i).Text 
    Next 

    ' show the results 
    Dim s As String = "" 
    For i = 0 To UBound(myArray) 
     s &= String.Format("myArray({0}): {1}", i, myArray(i)) & vbCrLf 
    Next 
    MsgBox(s, MsgBoxStyle.Information, "myArray Contents") 

    ' now go ahead and manipulate the array as needed 
    ' ... 
End Sub