我有一个包含以下重载的类:
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
答案 0 :(得分:1)
不知道你做错了,因为我不知道这些英里日志应该是什么意思(见下一段)。至少我可以指出你所看到的行为。在第一个.sort()调用中,首先比较第一个数字(让我们看看问题2.000和20.070的行)。 2.000不大于20.070,等于假,但OrElse等于真(9.000> 6.788),并返回1。
您确定您的输入数据是否正常?我把它读作起点和终点。你怎么能从@ mile 20.070开始并以6.788英里结束(向后走?)。如果数据不好,那么你的功能可能很好。另外,您可能只想专注于比较一列或另一列。