2014-12-31 14 views
6

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 ..

+2

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

+1

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

+0

@ user384842 dziękuję, proszę na przykład. – Anna

Odpowiedz

1

nie testowałem który z nich jest najszybszy albo prosząc DB o zwrot przefiltrowanej listy, albo sam wykonuj ją za pomocą pętli, ponieważ możesz użyć wielu wątków do zapętlenia się listy, na przykład rozważ użycie ExecutorService. Zamiast pętli od 1 do 3000 wierszy na jednym wątku podzielono go na kilka grup, z których każda miała na przykład 500 wierszy. Następnie przeprowadź każde 500 wierszy do innej działającej klasy i uruchom je wszystkie na ExecutorService. W ten sposób czas filtrowania dzieli się przez liczbę rdzeni procesora. Innym sposobem jest ustawienie indeksu na żądanych kolumnach i zapytanie do DB z twoimi parametrami. O ile wiem, najszybszym sposobem, jaki możesz osiągnąć, jest jedno z powyższych podejść, możesz eksperymentować i znaleźć najlepsze.

Powiązane problemy