如何在Java中以排序方式异步填充数组?

时间:2012-05-14 14:29:28

标签: java android sorting quicksort

我正在开发一个应用程序,我需要获取一个文件列表,从中读取一些数据,并在ListView中显示所有这些基于该数据排序的文件。

问题是它们可能有很多,所以加载它们需要时间。我可以选择异步加载它们(在一个线程中),或者显示一个加载框。我遇到第一个问题:ArrayAdapter正在填充,然后排序到最后,所以当所有项目都在那里时,列表没有排序。我想到的解决方案是:

  1. 我想在每次插入一个项目时对列表进行排序,但这样会使进程更慢......但是再次,有this,但我不确定我是怎么理解的使用这样的排序算法。

  2. 使用某种排序数组,如上所述here。我不确定如何使用ArrayAdapter来实现它。

  3. 忘记使用线程填充ListView。只需添加“正在加载”消息或根本不添加任何消息。

  4. 将数据存储在数据库中的文件中,并保存文件的路径,并读取数据库中的所有条目。但我不确定这会让这个过程更快......

  5. la = new ArrayAdapter(this, R.layout.list_item);
    setListAdapter(la);
    
    Handler handler = new Handler() {
        public void handleMessage(Message message) {
            switch (message.what) {
            case TrackBrowser.DID_SUCCEED: {
                // This is called when the thread is done finding the list of items
                // mComparator is my own Comparator
                la.sort(mComparator);
                break;
            }
            case TrackBrowser.ADD: {
                // This is called everytime an item is parsed
                TrackBrowser.TrackView tv = (TrackBrowser.TrackView) message.obj;
                la.add(tv);
                // Should I sort here everytime?
                //la.sort(mComparator);
                break;
            }
            }
        }
    };
    
    // This class just loops through the files returned by listFiles and sends messages.
    TrackBrowser tb = new TrackBrowser(handler); 
    Thread thread = new Thread(tb);
    thread.start();
    

    我需要您对我应该使用哪种解决方案的反馈,以及如何使用前两种解决方案(如果我应该使用它们)?

    非常感谢。

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

也许您可以使用TreeMap或TreeSet。当一个项目被添加到树中时,它将被添加到正确的位置,以便列表保持排序。