从ArrayList过滤数据的最快方法是什么?

时间:2014-12-31 19:28:50

标签: java android arraylist

如何从ArrayList过滤数据? 例如,我有一个名为“日期名称”的类。 我从下面的代码中写了一些我的解释:

    public class DateAndNames {

        int day;
        int month;
        int year;
        String name;

        public DateAndNames(int day, int month, int year, String name) {
            super();
            this.day = day;
            this.month = month;
            this.year = year;
            this.name = name;
        }
        public int getDay() {
            return day;
        }
...getters and setters...

我填充到数据库中:

DbHandler hand = new DbHandler(this);
hand.add(new DateAndNames(20, 3, 2008, "Jhon"));
hand.add(new DateAndNames(10, 3, 2008, "Jhon"));
hand.add(new DateAndNames(10, 2, 2004, "Jhon"));
hand.add(new DateAndNames(22, 3, 2008, "Jhon"));

然后我将数据传递给ArrayList:

ArrayList<DateAndNames> list = new ArrayList<DateAndNames>();
list = hand.getData();

在我将列表传递给BaseAdapter之前,我想过滤它,所以我现在正在做的是:

//filter by month and year:
public ArrayList<DateAndNames> filterTheList(int month , int year){
    //the data from the database
    list = hand.getData();
    //temp list to store the filtered list
ArrayList<DateAndNames> filteredList = new ArrayList<DateAndNames>();

for (int i = 0; i < list.size(); i++) {
    //check:
    if(list.get(i).getMonth() == month && list.get(i).getYear() == year){

        DateAndNames data = new DateAndNames(
                list.get(i).getDay(), 
                list.get(i).getMonth(), 
                list.get(i).getYear(),
                list.get(i).getName());
        //The data filtered:
        filteredList.add(data);
    }
}
return filteredList;
}

现在,最大的问题是:当我有一个非常非常大的数据要在for循环上运行,就像300行要过滤一样,应用程序运行速度非常慢!即使使用asyncTask它仍然工作缓慢! 我有点新,但我想要好的建议

编辑:我也试过了..

    public ArrayList<DateAndNames> getData(int month ,int year,String name){
        open();
        ArrayList<DateAndNames> list = new ArrayList<DateAndNames>();

            Cursor c = myDb.query(TABLE_DAY, null, "name= ? and month = ? and year = ?", new String[] {name,month+"",year+""}, null, null, null);
            while (c.moveToNext()) {
            DateAndNames resultData = new DateAndNames(
                    c.getInt(0), //id
                    c.getString(1),//name
                    c.getInt(2), //month
                    c.getInt(3));//year

            list.add(resultData);
            }
close();
return list;
}

但仍然没有工作..

1 个答案:

答案 0 :(得分:1)

我没有测试哪一个最快要么让DB返回已过滤的列表,要么自己使用循环执行它,因为您可以使用多个线程循环遍历列表,例如考虑使用ExecutorService。不是在单个线程上从1到3000行循环,而是将它分成多个组,每个组具有例如500行。然后将每500行传递给另一个runnable类,并在ExecutorService上运行所有这些行。以这种方式,过滤时间除以cpu的核心数。另一种方法是在所需列上设置索引并使用您的参数查询DB。据我所知,您可以通过以上方法之一实现最快的方法,您可以尝试并找到最佳方法。