2014-12-31 10 views
6

Come posso filtrare i dati da ArrayList? ad esempio, ho una classe chiamata "Date Names". Ho scritto poco dal codice qui sotto per la mia spiegazione:Qual è il modo più veloce per filtrare i dati da 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... 

e io popolo di base di dati del genere:

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")); 

in tanto sono i dati di ArrayList del genere:

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

e prima di passare l'elenco al BaseAdapter, voglio filtrarlo, quindi quello che sto facendo adesso è:

ora, il grande problema è: quando ho un gran numero di dati da eseguire sul ciclo for come 300 righe da filtrare, l'applicazione funziona molto lentamente! anche se si utilizza asyncTask funziona ancora lentamente! io sono un po 'nuovo, ma vorrei per buoni consigli

Modificato: ho provato anche questo ..

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; 
} 

Ma ancora non funziona ..

+2

È possibile modificare la query del database che si utilizza per selezionare le righe? Se dici 'seleziona da date_and_names dove mese = mese && anno = anno' allora i dati verranno filtrati prima di portarli in java – user384842

+1

Hai bisogno di 'filteredList' per contenere nuovi oggetti' DateAndNames', o è OK per 'filteredList 'per contenere riferimenti agli stessi oggetti in' list'? Non so cosa faccia il resto del tuo programma, quindi non posso rispondere. Ma se le liste possono condividere riferimenti, eliminare 'data' e dire semplicemente' filteredList.add (list.get (i)) '. Tuttavia, se 'list.size()' è solo 300, non riesco a vedere come ci vorrebbe abbastanza tempo per farvi notare. – ajb

+0

@ user384842 grazie vorrei per esempio per favore. – Anna

risposta

1

non ho ancora testato quale è il più veloce o chiedere al DB di restituire l'elenco filtrato o farlo da solo usando un ciclo perché è possibile utilizzare più thread per scorrere l'elenco, ad esempio considerare l'utilizzo di ExecutorService. Anziché eseguire il ciclo da 1 a 3000 righe su un singolo thread, suddividerlo in più gruppi, ciascuno con 500 righe. Quindi passa ogni 500 righe a una classe runnable diversa ed eseguine tutte su ExecutorService. In questo modo il tempo di filtraggio è diviso per il numero di core della CPU. Un altro modo è impostare l'indice sulle colonne desiderate e interrogare il DB con i parametri. Per quanto ne so, il modo più veloce che puoi ottenere è uno degli approcci sopra, puoi sperimentare e trovare il meglio.