1

我正在使用 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

4 回答 4

2

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

于 2011-05-29T03:43:33.107 回答
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));
    }
}
于 2011-05-29T03:55:42.203 回答
0

在我看来也很好。如果您遇到性能问题,您可能会检查您是否过于频繁地进行排序。现在不确定 Collections.sort 是否对此敏感,但如果您在仅插入几首歌曲后不使用已经排序的列表,您可能会有所收获

于 2011-05-29T05:56:33.077 回答
0

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

于 2014-04-24T16:43:02.160 回答