2015-12-01 4 views
-2

Проблема в том, что когда я сортирую список точек с X и Y, все, кроме одной точки, которая имеет тот же X, что и 4 других точки, но имеет наименьший Y, расположение индекса второе от последнего в списке. Сначала я просто следил за тем, чтобы сортировка выполняла больше одного раздражения, поскольку все точки только перемещали одно пятно и не более того, откуда они начинались в списке. Это мой по сравнению с методом, который используется для сортировки списка:Результат List.Sort() неверен

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 должен быть перемещен в третий элемент в списке.

+1

by 'если что-то изменилось', вы имеете в виду, что содержимое списка изменилось (как в чем-то добавленном или вставленном)? – Plutonix

+7

Вызов 'Sort()' как только полностью сортирует список. Я не понимаю, почему вы хотите повторно называть 'Sort()'. – itsme86

+1

, вы можете быть уверены, что отсортированы с помощью 'SortedList' –

ответ

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-х знаков после запятой произвольно; Я только выбрал его, потому что это то, что вы показываете. Использование большего количества десятичных знаков сохранит более «истинные» различия, но увеличит вероятность ложных срабатываний из-за неточности с плавающей запятой.

+0

Хорошо, я попробую, что –

+1

Это работало как шарм. Спасибо, что опубликовали что-то на самом деле вращается вокруг моей проблемы :) –

0

Я думаю, вы не понимаете, как работает Sort.

В вашем примере кода кажется, что вам кажется, что вам нужно вызвать сортировку несколько раз, чтобы отсортировать все элементы списка. Но это неправда.

Вызов его раз сортирует все элементы в Списке. Если после сортировки вы добавите элемент или измените значение элемента, вам может понадобиться снова вызвать сортировку. Поэтому бессмысленно указывать, происходит ли процесс сортировки - ваш код не будет продолжаться до тех пор, пока все элементы не будут в правильном порядке.

Функция встроенной сортировки также оптимизирована настолько быстро, насколько это возможно. Если вы это называете, и все уже в правильном порядке, произойдет очень мало вычислительной мощности - это просто подтвердит, что все в порядке.

Смежные вопросы