【问题标题】:Can one determine the progress of a Java Comparator?可以确定 Java Comparator 的进度吗?
【发布时间】:2012-11-29 09:59:00
【问题描述】:

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

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

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

【问题讨论】:

  • 比较器本身没有“进度”(因为它只需要几毫秒)。您需要跟踪 sort 调用的进度 - 我认为这只能通过使用您自己的实现来完成。
  • 好点...我应该看看 Collections 类或类似的类。
  • 刚刚找到stackoverflow.com/questions/3956142/… 有这个提示...
  • 我将解决方案更新为只排序一次。
  • "半分钟" 我怀疑你做错了什么,如果它花了这么长时间。你应该考虑优化你的代码。

标签: java sorting progress comparator


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这是我不会支付的价格...但它与我在上面的评论中发布的类似问题有关。
  • 这可能行得通...我会将典型计数设为 100%,然后在该基础上猜测进度。为什么不呢。
  • 一个很酷的功能,如果客户知道它还需要 20 分钟。休息时间;-)
【解决方案2】:

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

{
    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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2010-10-19
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多