Сортировка массивов с циклическим сравнением (бесконечный цикл?) - PullRequest
0 голосов
/ 24 февраля 2010

У меня есть несколько объектов, которые имеют 3 варианта сортировки: качество, качество и сравнение с другими объектами, отсортированные по этому порядку.

- (NSComparisonResult) compare: (MyObject *) obj {
if (self.quality > obj.quality)
return NSOrderedAscending;
else if (self.quality < obj.quality)
return NSOrderedDescending;

if (self.quantity > obj.quantity)
return NSOrderedAscending;
else if (self.quantity < obj.quantity)
return NSOrderedDescending;

if ([self betterThan: obj])
return NSOrderedAscending;

if ([obj betterThan: self])
return NSOrderedDescending;

return NSOrderedSame;
}

Моя проблема в том, что метод betterThan: может вызвать циклическое сравнение, если объекты имеют одинаковое качество и количество, и я хочу вернуть любой порядок сортировки в этом случае.

Например, A, B и C имеют одинаковое качество / количество, но

A betterThan: B => YES
B betterThan: C => YES
C betterThan: A => YES

Решения? Спасибо.

Ответы [ 3 ]

0 голосов
/ 24 февраля 2010

Я немного запутался в отношении вашего кода и вопроса. Похоже, у вас есть функция сравнения, которая будет сравнивать только качество (обе ветви первой, если в них есть возвраты). Если вы хотите использовать только лучше, чем в своем сравнении (я думаю, что это проблема, с которой вы сталкиваетесь ..), я бы сделал что-то вроде:

- (NSComparisonResult) compare: (MyObject *) obj {
    if ([self betterThan: obj])
        if ([obj betterThan: self])
            return NSOrderedSame
        else
            return NSOrderedAscending;
    else
        return NSOrderedDescending
}
0 голосов
/ 25 февраля 2010

Хорошо, я обнаружил, что ошибка не имеет ничего общего с сортировкой (хотя, похоже, она была вызвана этим).

Видимо, это действительно работает. Система прекращает сортировку, если есть тупик.

В любом случае, спасибо за ваше время. :)

0 голосов
/ 24 февраля 2010

Вы должны иметь метод betterThan: return NSOrderedSame. Все методы, которые возвращают NSComparisonResult, всегда должны иметь возможность возвращать все три параметра.

Ваш метод никогда не пройдет мимо первого if -block:

if (self.quality > obj.quality)
    return NSOrderedAscending;
else
    return NSOrderedDescending; //<== returns for both self.quality > obj.quality AND self.quality == obj.quality

Поскольку сравнение должно иметь один из трех результатов, но вы проверяете только один, вы всегда будете возвращаться из метода в этом блоке if. Ни одна другая логика никогда не будет использована.

Вам потребуется вложить блоки if, чтобы получить логику фильтрации. Проверьте, являются ли они больше и меньше, и вернитесь, но если они одинаковые, переходите к следующему тесту. Повторите по мере необходимости.

- (NSComparisonResult) compare: (MyObject *) obj {
    if (self.quality > obj.quality)
        return NSOrderedAscending;
    else if (self.quality < obj.quality)
        return NSOrderedDescending; 
    else {
        if (self.quantity > obj.quantity)
            return NSOrderedAscending;
        else if (self.quantity < obj.quantity)
            return NSOrderedDescending;
        else {
            ... and so on
        }
    }

Я думаю, что у каждого атрибута сравнения должен быть свой метод. Затем вы можете объединить их в одно грандиозное сравнение, если вам нужно всесторонне сравнить два объекта класса.

В данном случае похоже, что метод betterThan: - это фактическое сравнение классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...