为什么不使用两全其美?如果不再使用它,请使用TreeSet排序并使用内容初始化ArrayList
List<ComparableObject> sortedCollection =
new ArrayList<ComparableObject>(
new TreeSet<ComparableObject>(map.values()));
编辑:
我已经创建了一个基准测试(您可以在pastebin.com/5pyPMJav上访问它)来测试这三种方法(ArrayList + Collections.sort,TreeSet和我两全其美的方法),并且我的方法总是成功的。测试文件创建了一个包含10000个元素的映射,这些元素的值有一个故意比较糟糕的比较器,然后,这三种策略中的每一种都有机会a)对数据进行排序并b)对其进行迭代。这是一些示例输出(您可以自己测试):
编辑:我添加了一个方面,可以记录对Thingy.compareTo(Thingy)的调用,并且我还添加了一个基于PriorityQueues的新策略,该策略比以前的任何一种解决方案都快得多(至少在排序方面)。
compareTo() calls:123490
Transformer ArrayListTransformer
Creation: 255885873 ns (0.255885873 seconds)
Iteration: 2582591 ns (0.002582591 seconds)
Item count: 10000
compareTo() calls:121665
Transformer TreeSetTransformer
Creation: 199893004 ns (0.199893004 seconds)
Iteration: 4848242 ns (0.004848242 seconds)
Item count: 10000
compareTo() calls:121665
Transformer BestOfBothWorldsTransformer
Creation: 216952504 ns (0.216952504 seconds)
Iteration: 1604604 ns (0.001604604 seconds)
Item count: 10000
compareTo() calls:18819
Transformer PriorityQueueTransformer
Creation: 35119198 ns (0.035119198 seconds)
Iteration: 2803639 ns (0.002803639 seconds)
Item count: 10000
奇怪的是,我的方法在迭代中表现最佳(我本以为在迭代中与ArrayList方法没有区别,基准测试中是否有错误?)
免责声明:我知道这可能是一个糟糕的基准,但是它可以帮助您理解要点,我当然没有操纵它来使自己的方法成功。
(该代码具有与equals / hashcode / compareTo构建器相同的apache commons / lang依赖性,但是应该很容易将其重构)