如何从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;
}
但是仍然无法工作...
filteredList
包含新的DateAndNames
对象,还是filteredList
中包含指向list
中相同对象的引用也可以?我不知道你的程序的其余部分是什么,所以我不能回答。但如果列表可以共享引用,则去掉data
并只说filteredList.add(list.get(i))
即可。但是,如果list.size()
只有 300,我看不出它会花费足够的时间让你注意到。 - ajb