问题在于,当我使用X和Y All对点列表进行排序时,除了其中一个点与其他4个点具有相同X但具有最小Y点的点将被放置在列表中最后一个的索引位置。起初我只是确保排序执行了一次以上的刺激,因为所有点只移动了一个位置,而不是从列表中的位置开始。这是我与用于对列表进行排序的方法的比较:
Public Function CompareTo(ByVal other As Point) As Integer Implements System.IComparable(Of Point).CompareTo
Dim xCompare As Integer = Me.X.CompareTo(other.X)
If xCompare = 0 Then
Return Me.Y.CompareTo(other.Y)
End If
Return xCompare
End Function
分类后的项目
1:18.750,144.500
2:19.440,88.642
3:21.750,112.925
4:21.750,134.375
5:21.750,89.646
6:21.750,144.500
如您所见,5处的项目应移至列表中的第3项。
答案 0 :(得分:3)
您的比较算法没有任何逻辑错误。您的实际浮点值略有不同似乎是合理的,从而导致您观察到的顺序。我建议在比较时添加“相等”值的容差,可能通过舍入到比方说3位小数:
Public Function CompareTo(ByVal other As Point) As Integer Implements System.IComparable(Of Point).CompareTo
Dim xCompare As Integer = Math.Round(Me.X,3).CompareTo(Math.Round(other.X,3))
If xCompare = 0 Then
Return Math.Round(Me.Y,3).CompareTo(Math.Round(other.Y,3))
End If
Return xCompare
End Function
3位小数的选择是任意的;我只选择它,因为那是你展示的。使用更多小数将保留更多“真实”差异,但会增加由于浮点不准确而导致误报的可能性。
答案 1 :(得分:0)
我以为你不明白Sort是如何运作的。
通过您的代码示例,您认为必须多次调用sort才能对List的所有元素进行排序。但这不是真的。
调用它一次对List中的所有元素进行排序。如果在排序后添加元素或更改元素的值,则可能需要再次调用sort。因此,判断排序过程是否正在进行是毫无意义的 - 您的代码将继续运行,直到所有元素的顺序正确。
内置排序功能也经过优化,以尽可能快。如果你打电话给它并且一切都已经按照正确的顺序排列,那么处理能力就会很小 - 它只会确认一切都井然有序。