更高效的compareTo算法?

时间:2011-05-29 03:35:39

标签: java algorithm performance compareto

我正在使用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 个答案:

答案 0 :(得分:2)

假设歌曲排序的优先级是固定的(运行时间;标题,如果运行时间是相同的;作曲家,如果运行时间和标题是相同的),那么你可以做得更好。如果优先级没有固定,那么在标题之前对作曲家进行测试可能会加快速度;这取决于你的实际数据。我会首先测试运行时间,因为这总是比字符串比较更快。

答案 1 :(得分:2)

就像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 :(得分:0)

对我来说也很好看。如果遇到性能问题,可能会检查是否经常排序。不确定Collections.sort现在是否对此敏感,但是如果在插入少量歌曲后没有使用已经排序的列表,则可能会获得某些

答案 3 :(得分:0)

根据读取属性值所需的时间长度,将runningTime和s.runningTime首先存储到局部变量中可能会更快 tiny 位。所以平均而言,每次通话只读取1.5次或更多次,而不是每次通话只读一次。