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