Более эффективный алгоритм сравнения? - PullRequest
1 голос
/ 29 мая 2011

Я использую Collections.sort для сортировки ArrayList объектов, и я хочу посмотреть, есть ли более эффективный метод CompareTo для того, что я пытаюсь сделать.

Вот метод:

@Override
public int compareTo(Song s) {
    if (runningTime > s.runningTime) {
        return -1;
    } else if (runningTime < s.runningTime) {
        return 1;
    }
    int lastCmp = title.compareTo(s.title);
    return (lastCmp != 0 ? lastCmp : composer.compareTo(s.composer));
}

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

Ответы [ 4 ]

2 голосов
/ 29 мая 2011

Как сказал MeBigFatGuy, любое улучшение незначительно, но я думаю, что вы все равно можете немного очистить код, чтобы уменьшить ненужные условия if-else. Мои два цента.

public int compareTo(Song s) {
    if (runningTime != s.runningTime) {
        return s.runningTime - runningTime;
    }
    else {
        int lastCmp = title.compareTo(s.title);
        return (lastCmp != 0 ? lastCmp : composer.compareTo(s.composer));
    }
}
2 голосов
/ 29 мая 2011

Если предположить, что приоритет упорядочения песни фиксирован (время исполнения; заголовок, если время звучания одинаково; композитор, если время звучания и заголовки одинаковы), тогда вы не сможете добиться большего. Если приоритеты не фиксированы, то, возможно, тестирование на composer перед заголовком может немного ускорить процесс; это зависит от ваших фактических данных. Сначала я бы сохранил тест на время выполнения, потому что это всегда будет быстрее, чем сравнение строк.

0 голосов
/ 24 апреля 2014

В зависимости от того, сколько времени требуется для чтения значения свойства, может быть на крошечный бит быстрее, чтобы сначала сохранить runningTime и s.runningTime в локальных переменных. Таким образом, в среднем вместо того, чтобы читать их 1,5 или более раз за вызов, вы должны читать их только один раз за вызов.

0 голосов
/ 29 мая 2011

Хорошо выглядит и для меня. Если у вас проблемы с производительностью, вы можете проверить, не слишком ли часто выполняете сортировку. Не уверен, что Collections.sort сейчас чувствителен к этому, но вы можете получить sth, если не добавляете уже отсортированный список после добавления только нескольких песен

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