2010-06-22 4 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

затем Я вызываю метод .sort() объекта ArrayList, содержащий мои объекты. Выход я получаю

 
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 

вуаля! Он заказан так, как я ожидаю! Просто наоборот.

Итак, вот мой вопрос: я обнаружил ошибку или просто не делаю это правильно?

Благодаря

EDIT:

Вывод - Моя логика была просто написана неправильно.

Обновленная логика:

 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, что равно false, но OrElse равно true (9.000> 6.788), и вы возвращаете 1.

Вы уверены, что ваши данные в порядке? Я прочитал это как начальную милю и конец мили. Как вы можете начинать @ mile 20.070 и заканчиваться на миле 6.788 (Возвращаясь назад?). Если данные плохие, ваша функция, вероятно, прекрасна. Кроме того, вы, вероятно, просто хотите сосредоточиться на сравнении одного столбца или другого.

+0

Да, данные в порядке - я фактически обновляю программу - кто-то еще собрал спецификации (внутреннее веб-приложение для использования). После разговора с клиентом, по-видимому, идет назад * * ОК, поэтому я пытаюсь разрешить «перевернутые» данные. Поэтому, видимо, я только что преодолел свою логику. –

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