1

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

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

  1. 每次插入项目时,我都想对列表进行排序,但这会使过程变得更慢……但是,还是有这个,但我不确定我是否理解如何使用这种排序算法。

  2. 使用某种排序数组,如此所述。我不确定如何/是否可以使用ArrayAdapter.

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

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

la = new ArrayAdapter(this, R.layout.list_item);
设置列表适配器(拉);

处理程序处理程序=新处理程序(){
    公共无效句柄消息(消息消息){
        开关(消息。什么){
        案例 TrackBrowser.DID_SUCCEED: {
            // 当线程完成查找项目列表时调用
            // mComparator 是我自己的 Comparator
            la.sort(mComparator);
            休息;
        }
        案例TrackBrowser.ADD:{
            // 每次解析一个项目时都会调用它
            TrackBrowser.TrackView tv = (TrackBrowser.TrackView) message.obj;
            la.add(tv);
            // 我应该每次都在这里排序吗?
            //la.sort(mComparator);
            休息;
        }
        }
    }
};

// 这个类只是遍历 listFiles 返回的文件并发送消息。
TrackBrowser tb = new TrackBrowser(handler);
线程线程 = 新线程(tb);
线程.start();

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

非常感谢。

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 回答