2012-05-14 31 views
3

假设产生数HashMap<String, MyClass>数据结构,各自含有数十至数百MyClass类型的Comparable对象,这需要在一个单一的落得和排序Collection的一个应用程序。此功能SortedSet的或分类类别

两种可能的实现返回的SortedSet或排序列表如下:

public static Set<MyClass> getSortedSet(HashMap<String, MyClass>... allMaps) 
{ 
    SortedSet<MyClass> set = new TreeSet<MyClass>(); 

    Collection<MyClass> c; 

    for (HashMap<String, MyClass> map:allMaps) 
    { 
     c = map.values(); 
     set.addAll(c); 
    } 

    return set; 
} 

public static List<MyClass> getSortedList(HashMap<String, MyClass>... allMaps) 
{ 
    List<MyClass> list = new ArrayList<MyClass>(); 

    Collection<MyClass> c; 

    for (HashMap<String, MyClass> map:allMaps) 
    { 
     c = map.values(); 
     list.addAll(c); 
    } 

    Collections.sort(list); 

    return list; 
} 

会不会有任何明显的性能优势,以任何上述2种方法?

是否有更快的方式来实现相同的功能?

+5

如果你想知道哪个更快,为什么不测量他们的实际数据? – NPE

+0

因为其他人会使用该代码!我所要问的是,一个实施或另一个实施是否有更深的理由? – PNS

+0

您仍然可以始终进行负载测试,以了解更好的性能...... –

回答

4

您的排序列表方法的一些问题:

ArrayLists由数组支持。每当你添加一个新元素时,它可能不得不在场景后面增长数组。如果你想使用这种方法,你应该事先创建适当大小的ArrayList。

添加所有元素后的排序似乎不是最佳的。为什么不在正确的位置添加元素到列表中? (使用排序后的集合然后变成列表)A good Sorted List for Java

要真正回答你的问题,我会采用在后台使用TreeSet的方法。因为,如果用户想要,他们总是可以做Set.toArray()然后有一个列表。

+0

这似乎符合http://stackoverflow.com/questions/6971152/list-with-comparable-vs-treeset。从Set到List转换的通用解决方案可以在http://stackoverflow.com/questions/740299/how-do-i-sort-a-set-to-a-list-in-java找到。谢谢! – PNS

1

集合和列表的不同之处在于它们的本质,集合不会重复。你只能有一个对象的实例。列表允许你保持重复。

因此,集合做更多的工作,因此他们更慢。

+0

当然,但是让我们假设没有重复。是否有理由认为一个实现总是比另一个实现更快? – PNS

+0

也许这不是关于是否存在重复,而是关于检查元素是否已经存在于该集合中的说明。所以答案仍然适用。 – Carlo

+1

@PNS请参阅下面的Colin D答案。使用TreeSet并让用户在需要时派生一个数组是一种很好的方法。 –

2

是否有理由认为一个实现总是比另一个实现更快?

不,没有理由认为。

这是更快也取决于数据量,其性质,在比较的性能特点,在你的JDK,在JIT编译器等

只有这样,才能知道肯定是基准现实数据上的代码。

+0

有人指出http://stackoverflow.com/questions/6971152/list-with-comparable-vs-treeset,但随后删除了评论。尽管如此,TreeSet似乎确实速度更快。 – PNS

+0

@PNS:这是一个不同的问题(他们在每次插入后对列表进行排序,而你只在最后排序)。 – NPE