2014-12-31 17 views
6

Wie kann ich Daten von ArrayList filtern? zum Beispiel habe ich eine Klasse namens "Date Names". i schrieb wenig von Code unten für meine Erklärung:Was ist der schnellste Weg, Daten von ArrayList zu filtern?

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

und ich bevölkern zur Datenbank wie folgt aus:

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

und dann bekomme ich die Daten so zu Arraylist:

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

und bevor ich die Liste an den BaseAdapter übergebe, möchte ich es filtern, also was ich gerade mache ist das:

jetzt, das große Problem ist: wenn ich sehr sehr sehr große Daten auf der for-Schleife wie 300 Zeilen zu filtern haben, läuft die App sehr langsam! Selbst wenn asyncTask verwendet wird, funktioniert es immer noch langsam! ich bin ein bisschen neu, aber ich würde

Edited für gute Ratschläge wie: ich dies auch versucht ..

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

aber immer noch nicht funktioniert ..

+2

Können Sie die Datenbankabfrage ändern, die Sie verwenden, um die Zeilen auszuwählen? Wenn Sie sagen 'Wählen Sie aus dates_and_names wo month = month && year = year' dann werden die Daten gefiltert, bevor Sie es in Java bringen – user384842

+1

Benötigen Sie 'filteredList' um neue' DateAndNames' Objekte zu enthalten, oder ist es OK für 'filteredList 'Verweise auf dieselben Objekte in' list' enthalten? Ich weiß nicht, was der Rest deines Programms macht, also kann ich das nicht beantworten. Aber wenn die Listen Referenzen teilen können, wird "data" los und einfach "filteredlist.add (list.get (i))" sagen. Wenn 'list.size()' jedoch nur 300 ist, kann ich nicht sehen, wie es dauern würde, bis Sie es bemerken. – ajb

+0

@ user384842 danke ich möchte zum Beispiel bitte. – Anna

Antwort

1

Ich habe nicht getestet Welches ist am schnellsten, entweder die DB bitten, die gefilterte Liste zurückgeben oder selbst tun Sie es mit einer Schleife, weil Sie mehrere Threads verwenden können, um die Liste durchlaufen, zum Beispiel in Betracht ziehen, ExecutorService. Anstatt eine Schleife von 1 bis 3000 Zeilen in einem einzelnen Thread zu verwenden, wird sie in mehrere Gruppen unterteilt, von denen jede z. B. 500 Zeilen hat. Dann übergeben Sie alle 500 Zeilen an eine andere ausführbare Klasse und führen Sie alle unter ExecutorService. Auf diese Weise wird die Filterzeit durch die Anzahl der Kerne der CPU dividiert. Eine weitere Möglichkeit besteht darin, den Index auf die gewünschten Spalten zu setzen und den DB mit Ihren Parametern abzufragen. Soweit ich weiß, ist der schnellste Weg, den Sie erreichen können, einer der obigen Ansätze, Sie können experimentieren und das Beste finden.

Verwandte Themen