3

我有许多HashMap包含数百个Comparable对象(例如 type MyClass)的数据结构,需要将所有值(不是键)放在一个数据结构中,然后对其进行排序。

由于MyClass物体的体积和到达率,这个过程(至少每毫秒执行一次)需要尽可能高效。

一种方法是使用SortedSet,大致如下:

HashMap<String, MyClass>[] allMaps = ... // All the HashMaps

SortedSet<MyClass> set = new TreeSet<MyClass>();

Collection<MyClass> c;

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

将已排序的集合传递给 可能会更快,这可能会在每次插入时或在每次插入后set.addAll()重新排序。TreeSet但是,要这样做,List需要将 a 传递给Collections.sort(),这意味着必须进行从Collectionto的转换List,即必须维持另一个性能损失。

此外,可能还有另一种更有效的方式来实现相同的目标。

注释?

4

1 回答 1

1

我认为答案有点取决于 MyClass 数据的变化趋势。例如,如果您在每个时间范围内有几个新值,那么您可能需要考虑保留最后返回的排序集和先前键的副本,以便在下一次运行时,您可以执行更改的增量(即在地图中找到新键并手动将它们插入您上次返回的排序集中)。

如果 MyClass 对象可能会从地图中删除,则此算法会有所不同。但一般的想法是让它更快,你必须找到一种方法来执行增量更改,而不是每次都重新处理整个集合。

于 2012-05-14T11:52:18.593 回答