2014-12-31 24 views
6

Verileri ArrayList'den nasıl filtreleyebilirim? Örneğin, , "Tarih İsimleri" adlı bir tane var. i aşağıda benim açıklama için koddan biraz yazdı:ArrayList'ten verileri filtrelemenin en hızlı yolu nedir?

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

ve ben böyle veritabanına doldurmak:

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

ve sonra ben böyle ArrayList veri almak:

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

ve listeyi BaseAdapter'e aktarmadan önce, şu anda yaptığım şeyi filtrelemek istiyorum:

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

şimdi, büyük sorun şudur: filtrelemek için 300 satır gibi döngü için çok çok büyük bir veriyi çalıştırdığımda, uygulama çok yavaş çalışıyor! asyncTask kullanmasa bile hala yavaş çalışıyor! i biraz yeniyim ama

Düzenlendi iyi tavsiye için istiyorum: ben de denedim ..

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

Ama hala çalışmıyor ..

+2

Satırları seçmek için kullandığınız veritabanı sorgusunu değiştirebilir misiniz? Eğer 'date_and_names'ten ay = month && year = year' seçimini yaparsanız, veriler java – user384842

+1

içine getirilmeden önce filtrelenir. Yeni 'DateAndNames 'nesnelerini içermek için' filterList''e ihtiyacınız var mı yoksa filterList için uygun mu? '' listedeki aynı nesnelere referanslar içermek? Programının geri kalanının ne olduğunu bilmiyorum, bu yüzden buna cevap veremem. Ancak listeler referansları paylaşabilirse, veriden kurtulun ve sadece filterList.add (list.get (i)) 'deyin. Ancak, eğer 'list.size()' sadece 300 ise, fark etmenizin ne kadar zaman alacağını göremiyorum. – ajb

+0

@ user384842 thank istiyorum örneğin lütfen. – Anna

cevap

1

ben test etmedim hangisinin en hızlı olduğu ya da DB'nin filtrelenmiş listeyi döndürmesini istemeniz ya da kendiniz bir döngü kullanarak bunu yapabilmenizdir, çünkü listeden döngü yapmak için birden fazla iş parçacığı kullanabilirsiniz, örneğin ExecutorService'u kullanmayı düşünün. Tek bir iplik üzerinde 1 ila 3000 satırdan döngü yapmak yerine, bunların her biri örneğin 500 satır içeren çoklu gruplara bölünür. Sonra her 500 satırın farklı bir runnable sınıfına geçirin ve hepsini ExecutorService'da çalıştırın. Bu şekilde, filtreleme süresi, cpu'nun çekirdek sayısına bölünür. Başka bir yöntem de, istenen sütunlarda dizini ayarlamak ve DB'nizi parametrelerinizle sorgulamaktır. Elde edebileceğin en hızlı yolu bildiğim kadarıyla yukarıdaki yaklaşımlardan biri, en iyisini deneyebilir ve bulabilirsin.

İlgili konular