7

我正在使用一个Comparator实现来对大量对象进行排序。根据此集合中对象的类型,排序需要几毫秒到半分钟。有什么方法可以确定Comparatorwhile 排序的进度吗?我想为用户可视化这一点。

Collections.sort(sorted, new Comparator<Object[]>() {
    public int compare(Object[] o1, Object[] o2) {
        /* do it... */
        return order;
    }
}

该集合可能包含简单的短字符串对象、日期对象或(最坏情况)CLOB 对象,它们需要在排序时获取数据。

4

2 回答 2

2

您可以通过编写一个计算“全局”变量的比较器来做到这一点。

但是为了分析目的可视化进度,你必须复制你的列表,并对其进行两次排序。第一次确定比较器调用的次数。下一次你知道你已经走了多远,通过将当前计数器与第一次排序的值进行比较。

当另一个线程正在排序时,您需要第二个线程来读出计数器。

另一种可能性是估计比较器调用的数量:平均而言,这可能与 n * ld (n) 有关。

然后再次计数,并从另一个线程读取。这样,您只需排序一次。

于 2012-11-29T10:09:19.833 回答
0

我已经这样做了(剥离示例)...感谢您的输入。

{
    final long mc = (long) (data.size() * Math.log(data.size()));
    Collections.sort(sorted, new Comparator<Object[]>() {
        long c = 0; 
        public int compare(Object[] o1, Object[] o2) {
            // Using Events to update the GUI...
            Events.instance().raiseEvent(StatusBean.EVENT_STATUS, "Sorting...", (int) ((100.0 / mc) * this.c++));
            /* do it... */
            return order;
        }
    }
}
于 2012-11-29T10:53:22.050 回答