2012-01-18 90 views
0

Basicly我有一個程序,檢索數據並分析它,這是很好的,所以從開始:排序並排2個陣列側

11:981.8現在我做了什麼是分裂它等於十一月981.8 「11月」和「981.8」分成兩個不同的數組,現在我需要做的是按照升序或降序對數組進行排序,但是保持一致,11月和981.8一方在列表框中。

我當前的代碼是:

Private Sub sortData(ByVal strYear As String, ByVal strSort As String) 
    lbDispData.Items.Clear() 

    Dim strData As String = My.Settings.usage2011 
    Dim arrRawData() As String 
    Dim arrMonth As New ArrayList 
    Dim arrKilo As New ArrayList 

     arrRawData = strData.Split("_") 

     For Each strUsage As String In arrRawData 
      Dim arrSmall As String() 
      arrSmall = strUsage.Split(":") 
      arrSmall(0) = MonthName(arrSmall(0)) 

      arrMonth.Add(arrSmall(0)) 
      arrKilo.Add(arrSmall(1)) 
     Next 

     If strSort = 0 Then 
      'Sort in ascending order 
     ElseIf strSort = 1 Then 
      'Sort in descending order 
     End If 
End Sub 

或者如果可能的話有沒有更好的辦法?

編輯:只是提了,還有更多的價值,而不僅僅是十一月和981.8,會有例如十二月和128.1,一月和191.1,等

回答

2

不要使用兩個數組。使用一個數組或List,並且數組中的每個項目應該是具有Month和Kilo屬性的自定義類的實例,或者是一個Tuple實例。

然後你可以根據你想要的任何屬性進行排序,而不必擔心相關信息在一起。

要爲項目創建一個元組,你用Tuple.Create:

Dim myTuple = Tuple.Create(monthValue, kiloValue) 

然後你可以使用項目1,項目2元組訪問值等

Dim month = myTuple.Item1 
Dim kilo = myTuple.Item2 
+0

我從來沒有使用Tuple's之前,我將如何實現它到我的代碼,或者如果可能添加到一個元組和排序它,謝謝。 – 2012-01-18 17:58:40

+0

我用一個例子編輯了我的問題。 – 2012-01-18 18:21:00

+0

那麼元組是否存儲多個值?所以如果我在數組中創建了一個For Each Item並在其中創建了一個元組,它會爲每個項創建一個元組?編輯:對不起,我忘了在我原來的問題中提到,每個月有一組值,所以2 x 12. – 2012-01-18 18:23:34

0

基本上有存儲這種數據的兩種方法:結構數組或數組結構。目前,您的實施是後者。正如您所懷疑的那樣,前者在提供對象和用戶定義類型訪問權的語言中通常是首選。

要使用結構數組表示來解決這個問題,您將定義自己的類型 - 例如,您可以將其稱爲MonthFloatPair或與您的應用程序更相關的東西,或者您可以簡單地使用內置類型適合您的需要 - 並且有一個MonthFloatPair類型的單個數組。要添加一個MonthFloatPair,你應該像現在一樣解析一個字符串,然後簡單地將月份分配給MonthFloatPair的一個成員和數字(Kilo?)給另一個成員。然後,你所要做的就是編寫一個方法來提供MonthFloatPair對象的排序比較(無論如何,我相信這在vb.net中都是可行的),然後按照你的意願對這個數組進行正常排序。

要使用數組結構的數據表示來解決這個問題,你現在正在做你正在做的事情。要按照您對排序數組進行排序的方式進行排序,但要注意一點:每次更改排序基礎的數組元素的位置(例如,通過交換O(n^2)排序,或者像在MergeSort中那樣放入一個新數組中),您需要以相同的方式移動另一個數組中的對應(相同索引)元素。