Java 分类集合或分类集合

Java 分类集合或分类集合,java,list,sorting,collections,sortedset,Java,List,Sorting,Collections,Sortedset,假设一个应用程序生成了大量的HashMap数据结构,每个数据结构都包含几十到几百个类型为MyClass的可比较的对象,这些对象需要在一个单独的集合中排序 此功能的两种可能实现返回SortedSet或SortedList,如下所示: public static Set<MyClass> getSortedSet(HashMap<String, MyClass>... allMaps) { SortedSet<MyClass> set = new Tree

假设一个应用程序生成了大量的
HashMap
数据结构,每个数据结构都包含几十到几百个
类型为
MyClass
的可比较的
对象,这些对象需要在一个单独的
集合中排序

此功能的两种可能实现返回SortedSet或SortedList,如下所示:

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;
}
公共静态集getSortedSet(HashMap…allMaps)
{
SortedSet集合=新树集合();
c组;
for(HashMap映射:allMaps)
{
c=map.values();
set.addAll(c);
}
返回集;
}
公共静态列表getSortedList(HashMap…allMaps)
{
列表=新的ArrayList();
c组;
for(HashMap映射:allMaps)
{
c=map.values();
列表。addAll(c);
}
集合。排序(列表);
退货清单;
}
上述两种方法中的任何一种都有明显的性能优势吗


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

集合和列表因其性质不同而有所不同,集合不保留重复项。一个对象只能有一个实例。列表允许您保留重复项

因此,集合做更多的工作,因此它们的速度较慢

是否有任何理由认为一种实现总是比另一种更快

不,没有理由这么认为

哪个更快可能取决于数据量、属性、比较器的性能特征、JDK、JIT编译器等


唯一确定的方法是根据实际数据对代码进行基准测试。

排序列表方法存在一些问题:

ArrayList由数组支持。无论何时添加新元素,都可能需要在幕后增加阵列。如果您想使用这种方法,您应该先创建适当大小的ArrayList

添加所有元素后的排序似乎不是最优的。为什么不在列表中正确的位置添加元素?(使用已排序的集合,然后转换为列表)


为了真正回答你们的问题,我会采用在幕后使用树集的方法。因为,如果用户愿意,他们总是可以执行Set.toArray(),然后创建一个列表。

如果您想知道哪个更快,为什么不在您的实际数据上测量它们?因为其他人将使用该代码!我所要问的是,一种实现或另一种实现是否有加快速度的深刻原因!您仍然可以随时进行负载测试,以了解更好的性能…当然可以,但假设没有重复项。有没有理由认为一个实现总是比另一个实现快?也许这不是关于是否存在重复项,而是关于检查集合中是否存在元素的说明。所以答案仍然适用。@PNS请参见下面的Colin D答案。使用树集并让用户在需要时导出数组是一个好方法。他的答案放在上面,但得到了。谢谢有人指出,但随后删除了评论。不过,看起来TreeSet确实更快。@PNS:这是一个不同的问题(它们在每次插入后对列表进行排序,而您只在最后进行排序)。这似乎符合我们的要求。有关从集合转换为列表的通用解决方案,请访问。谢谢