7

Comparatorオブジェクトの大規模なコレクションをソートするために実装を使用しています。このコレクション内のオブジェクトのタイプに応じて、並べ替えには数ミリ秒から 30 分かかります。並べ替え中の進行状況を判断する方法はありますComparatorか? ユーザーのためにこれを視覚化したいと思います。

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

コレクションには、単純な短い String オブジェクト、Date オブジェクト、または (最悪の場合) ソート中にデータを取得する必要がある CLOB オブジェクトが含まれる場合があります。

4

2 に答える 2

2

「グローバル」変数をカウントアップするコンパレータを作成することで、これを行うことができます。

ただし、分析目的で進行状況を視覚化するには、リストをコピーして 2 回並べ替える必要があります。初めてコンパレータ呼び出しの数を決定するとき。次回、現在のカウンターを最初の並べ替えの値と比較することで、現在の距離を知ることができます。

他のスレッドがソートしている間にカウンターを読み取るには、2 つ目のスレッドが必要です。

もう 1 つの可能性は、コンパレータ呼び出しの数を見積もることです。平均すると、これは 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 に答える