Метод сортировки неправильно - PullRequest
0 голосов
/ 27 февраля 2011

Я звоню Arrays.sort(schedule, c);, где c - это экземпляр компаратора, подобный так:

import java.util.Comparator;

public class FirstOccComparator implements Comparator<AbstractEvent> {

    public int compare(AbstractEvent event1, AbstractEvent event2) {        
          int result = 0;       
          if (event1 == null || event2 == null) {
              //System.out.println("null");
          }
          else if (event1.hasMoreOccurrences() && event2.hasMoreOccurrences()) {
            result = event1.nextOccurrence().compareTo(event2.nextOccurrence());
          }
          return result;
    }

}

Вывод, который я получаю, не тот, каким он должен быть.Мне интересно, если кто-то может указать мне правильное направление здесь.Это первый алгоритм сортировки, который я когда-либо делал, и он использует концепции, которые все еще являются новыми для меня (компараторы и реализация), поэтому извините за многочисленные вопросы, касающиеся моего кода:)

РЕДАКТИРОВАТЬ В этом разница между выходными данными: http://pastebin.com/LWy1jqkt

Существует два вида событий: методы hasMoreOccurrence () и nextOccurrence ():

DailyEvent

public boolean hasMoreOccurrences() {
        boolean result = false;
        Date check = nextOccurrence();
        timesCalled--;
        if (check instanceof Date && check != null) {
            result = true;
        }
        return result;
    }

public Date nextOccurrence() {
        if (timesCalled > recurrences) {
            return null;
        }
        else {
            Calendar cal = Calendar.getInstance();
            cal.setTime(startTime);
            cal.add(Calendar.DATE, timesCalled);
            timesCalled++;
            return cal.getTime();
        }
    }

WeeklyEvent

public boolean hasMoreOccurrences() {
        Date tmp = nextOccurrence();
        timesCalled--;
        boolean result = false;
        if (tmp instanceof Date && tmp != null) {
            result = true;
        }

        return result;
    }

public Date nextOccurrence() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(startTime);
        cal.add(Calendar.DATE, timesCalled*7);

        if (cal.getTime().compareTo(this.endTime) > 0) {
            return null;
        }
        else {
            timesCalled++;
            return cal.getTime();
        }
    }

Ответы [ 4 ]

2 голосов
/ 27 февраля 2011

Есть несколько вещей, которые кажутся неверными с вашим компаратором.

Например, что произойдет, если только один из них будет нулевым? Как вы хотите, чтобы те сортировать? Прямо сейчас вы рассматриваете два события равными, если одно из них равно нулю.

Кроме того, что произойдет, если у одного события будет больше событий, а у другого нет? Прямо сейчас вы проводите сравнения только в случае появления обоих случаев. Вам нужно разобраться со случаем, когда один имеет место, а другой нет.

Кроме того, если вхождение является пользовательским классом, вам также необходимо оценить этот компаратор.

1 голос
/ 27 февраля 2011

Когда поведение не соответствует вашим предположениям, возможно, пришло время проверить ваши предположения.

"... не то, что должно быть ..." предполагает, что у вас есть представлениео том, как должен работать ваш компаратор, который не соответствует выводу.Поскольку алгоритм сортировки, встроенный в Коллекции, проверен, я думаю, вам нужно посмотреть на ваш класс и его Компаратор на наличие ошибки.

Напишите несколько тестов модулей и посмотрите, где вы ошиблись.

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

0 голосов
/ 27 февраля 2011

Ваш алгоритм определения равенства глубоко ошибочен. Прочитайте это для более подробной информации: http://blogs.msdn.com/b/oldnewthing/archive/2003/10/23/55408.aspx?wa=wsignin1.0

0 голосов
/ 27 февраля 2011

Задайте себе вопрос: что происходит, когда события1 и событие2 не равны нулю, но у одного (или обоих) исчерпаны вхождения?

...