2011-05-29 70 views
1

我使用Collections.sort进行排序对象的ArrayList的,我想看看是否有什么我试图做一个更有效的compareTo方法。更高效的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

我不明白你的问题的标题有你问的问题怎么办? – 2011-05-29 03:36:57

+0

@Vincent Ramdhanie哎呀对不起队友,我忘了从以前的问题,我会写更改标题名称。我很抱歉。 – thatbennyguy 2011-05-29 03:39:30

+6

任何改进都是微不足道的。你的方法对我来说似乎很好。 – MeBigFatGuy 2011-05-29 03:39:49

回答

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

返回后不需要其他东西 – Nicolas78 2011-05-29 05:52:24

+0

如果运行时间是双倍,并且运行时间的差异小于一秒,则这不起作用。最糟糕的是结果不一致;你可以有a = b和b = c但是一个 gnasher729 2014-04-24 16:40:40

2

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

0

对我来说也不错。如果遇到性能问题,您可能会检查您是否经常排序。不知道现在Collections.sort是否对此敏感,但是如果在插入几首歌曲后不重新排序已经排序的列表,您可能会获得某些收益

0

根据读取属性值需要多长时间,这可能是一个微小的更快地runningTime和s.runningTime存储到本地变量第一。因此,平均而言,每次通话只需读取1.5次或更多次,而不是每次通话读取一次。