1

私は、ファイルのリストを取得し、そこからいくつかのデータを読み取り、そのデータに基づいて並べ替えられたこれらすべてのファイルをListViewに表示する必要があるアプリを開発しています。

問題は、それらがたくさんある可能性があるため、それらすべてをロードするのに時間がかかることです。それらを非同期で(スレッドで)ロードするか、ロードボックスを表示するかを選択しました。私は最初のものに問題があります:ArrayAdapterが埋められ、最後にソートされているので、すべてのアイテムがそこにあるときまでに、リストはソートされていません。私が考えた解決策は次のとおりです。

  1. アイテムを挿入するたびにリストを並べ替えることを考えましたが、それではプロセスがさらに遅くなります...しかし、これもありますが、そのような並べ替えアルゴリズムの使用方法がわかりません。

  2. ここで説明するように、ある種のソートされた配列を使用します。で実装する方法/かどうかはわかりませんArrayAdapter

  3. スレッドを使用してを埋めることを忘れてくださいListView。「読み込み中」のメッセージを追加するか、何も追加しないでください。

  4. データをデータベース内のファイルに保存し、ファイルのパスを保存して、データベースからすべてのエントリを読み取ります。しかし、これによってプロセスが速くなるかどうかはわかりません...

la = new ArrayAdapter(this、R.layout.list_item);
setListAdapter(la);

ハンドラーhandler=new Handler(){
    public void handleMessage(メッセージメッセージ){
        スイッチ(message.what){
        ケースTrackBrowser.DID_SUCCEED:{
            //これは、スレッドがアイテムのリストを検索し終えたときに呼び出されます
            //mComparatorは私自身のコンパレータです
            la.sort(mComparator);
            壊す;
        }
        ケースTrackBrowser.ADD:{
            //これはアイテムが解析されるたびに呼び出されます
            TrackBrowser.TrackView tv =(TrackBrowser.TrackView)message.obj;
            la.add(tv);
            //毎回ここで並べ替える必要がありますか?
            //la.sort(mComparator);
            壊す;
        }
        }
    }
};

//このクラスは、listFilesによって返されたファイルをループして、メッセージを送信します。
TrackBrowser tb = new TrackBrowser(handler);
スレッドthread=new Thread(tb);
thread.start();

どのソリューションを使用すべきか、最初の2つをどのように使用するか(使用する必要がある場合)についてのフィードバックが必要ですか?

どうもありがとう。

4

2 に答える 2

1

二分探索を使用して、新しい要素を挿入するための適切な位置を見つけることができます。その結果、リストは常にソートされます。

例えば:

public static void add(List<Integer> list, Integer value) {
    int index = Collections.binarySearch(list, value);
    list.add((index < 0) ? (-index - 1) : index, value);
}

public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();

    add(list, 1);
    add(list, -5);
    add(list, -7);
    add(list, 100);
    add(list, 0);
    add(list, 90);
    add(list, -10);
    add(list, 0);
    add(list, 1);

    System.out.print(list);
}

次に、次のような出力が得られます。

[-10, -7, -5, 0, 0, 1, 1, 90, 100]

正常に動作します。最悪の場合、バイナリ検索が実行さO(log(N))れ、挿入が実行されます(新しい要素を挿入するときに、リスト内の要素の再配置が発生する可能性があるため)。O(N)その結果、時間がかかりO(N + log(N))ます。O(N*log(N))毎回リストを並べ替えるよりも優れています。

于 2012-05-14T16:07:13.297 に答える
0

たぶん、TreeMapまたはTreeSetを使用できます。アイテムがツリーに追加されると、正しい位置に追加されるため、リストは並べ替えられたままになります。

于 2012-05-14T14:37:29.580 に答える