2010-06-22 47 views
0

我有一類具有以下過載:VB.NET奇怪的排序行爲?

Public Overloads Function CompareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo 
    ' I want a logmile, darn it! 
    If Not TypeOf obj Is Logmile Then Throw New ArgumentException 

    If Me("beg_logmile") > obj("beg_logmile") OrElse Me("end_logmile") > obj("end_logmile") Then 
     ' I start or end after the other guy 
     Return 1 
    ElseIf Me("beg_logmile") < obj("beg_logmile") OrElse Me("end_logmile") < obj("end_logmile") Then 
     ' I start or end before the other guy 
     return -1 
    Else 
     ' Well, we must be equivalent then! 
     Return 0 
    End If 
End Function 

我創建了以下數據的ArrayList(當時沒有下令它的輸入):

 
0.000 1.000 
1.000 2.000 
2.000 9.000 
20.070 6.788

然後我調用包含我的對象的ArrayList的.sort()方法。我得到的輸出是

 
0.000 1.000 
1.000 2.000 
20.070 6.788 
2.000 9.000 

但是,如果我compareTo我換-1和1,我得到下面的輸出:

 
20.070 6.788 
2.000 9.000 
1.000 2.000 
0.000 1.000 

瞧!它以我期望的方式排列!恰好相反。

所以,這裏是我的問題:我發現了一個錯誤,或者我只是不正確嗎?

感謝

編輯:

結論 - 我的邏輯是剛剛寫的不對。

更新邏輯:

 If Me("beg_logmile") > obj("beg_logmile") OrElse Me("beg_logmile") = obj("beg_logmile") and Me("end_logmile") > obj("end_logmile") Then 
      ' I start or end after the other guy 
      Return 1 
     ElseIf Me("beg_logmile") < obj("beg_logmile") OrElse Me("end_logmile") = obj("end_logmile") and Me("end_logmile") < obj("end_logmile") Then 
      ' I start or end before the other guy 
      Return -1 
     Else 
      ' Well, we must be equivalent then! 
      Return 0 
     End If 

回答

1

不知道你這樣做是不是錯了,因爲我不知道這些英里日誌應該是指(見我的下一段)。至少我可以指出你看到的行爲。在你的第一個.sort()調用中,你首先比較第一個數字(讓我們看看問題2.000和20.070中的那一行)。 2.000不大於20.070,這相當於假,但OrElse等於真(9.000> 6.788),並且返回1.

您確定您的輸入數據是否正確?我把它看作是開始英里和結束英里。你如何開始@英里20.070並結束6.788英里(向後走?)。如果數據不好,那麼你的功能可能很好。否則,您可能只想專注於比較一列或另一列。

+0

是的,數據是確定的 - 我實際上正在更新程序 - 別人已經收集了規格(內部使用的Web應用程序)。在與客戶交談後,顯然後退*是*好,所以我試圖允許「反向」數據。所以顯然我剛剛得到了我的邏輯。 – 2010-06-22 19:34:50