Jak mogę filtrować dane z ArrayList? Na przykład mam jedną klasę o nazwie "Date Names". napisałem trochę z kodu poniżej dla mojego wyjaśnienia:Jaki jest najszybszy sposób filtrowania danych z 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...
i wypełnić do bazy tak:
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"));
a następnie uzyskać dane do ArrayList tak:
ArrayList<DateAndNames> list = new ArrayList<DateAndNames>();
list = hand.getData();
i przed przekazaniem listy do BaseAdapter, chcę ją odfiltrować, więc teraz robię to:
//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;
}
teraz, dużym problemem jest: kiedy mam bardzo bardzo duże dane do uruchomienia w pętli for jak 300 wierszy do filtrowania, aplikacja działa bardzo wolno! nawet jeśli używasz asyncTask nadal działa wolno! jestem trochę nowy, ale chciałbym dobrych rad
edycja: próbowałem to zbyt ..
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;
}
Ale nadal nie działa ..
Czy możesz zmienić zapytanie do bazy danych, którego używasz do wybierania wierszy? Jeśli powiesz "wybierz z date_and_names gdzie miesiąc = miesiąc && rok = rok", dane zostaną odfiltrowane przed przeniesieniem do java – user384842
Czy potrzebujesz 'filteredList', aby zawierała nowe obiekty' DateAndNames', czy też jest to w porządku dla 'filtersList 'zawierać odniesienia do tych samych obiektów w' liście'? Nie wiem, co robi reszta twojego programu, więc nie mogę na to odpowiedzieć. Ale jeśli listy mogą udostępniać referencje, pozbądź się "danych" i po prostu powiedz "filteredList.add (list.get (i))". Jednakże, jeśli 'list.size()' ma tylko 300, nie widzę jak zajęłoby ci to wystarczająco dużo czasu. – ajb
@ user384842 dziękuję, proszę na przykład. – Anna