2015-04-06 56 views
2

我有一個項目,一個列表,其中每一個項目包含產品的價格,現在我想根據用戶輸入如何根據兩個值

我接受的最低和最高價格來篩選我的數組列表過濾的ArrayList範圍,現在我想顯示那些只在這些價格範圍內的記錄。

我正在使用btnSearch來過濾列表,以顯示兩個值之間的記錄,就像我想顯示記錄那些在這兩個值之內;

20000至50000

btnSearch.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       editMin.getText().toString(); 
       editMax.getText().toString(); 
      } 
     }); 

我使用下面的代碼基於高至低的價格區間來篩選記錄,併爲我使用下面的代碼:

btnHTL.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View arg0) { 
// TODO Auto-generated method stub 

Collections.sort(arrayList, new Comparator<Home>() { 

    @Override 
    public int compare(Home arg1, Home arg2) { 
    // TODO Auto-generated method stub 
     Integer obj1 = new Integer(arg1.getPrice().replace(",", "")); 
     Integer obj2 = new Integer(arg2.getPrice().replace(",", "")); 
     return (obj2).compareTo(obj1); 
    } 
    }); 

    for (int i = 0; i < arrayList.size(); i++) { 
     System.out.println("HTL:--" + arrayList.get(i).getPrice());      
    } 
     adapter.notifyDataSetChanged(); 
    } 
    }); 
+0

那麼你面臨什麼問題?任何異常,結果? – 2015-04-06 09:38:11

+0

我不知道如何過濾列表,以顯示兩個值之間的記錄 – Sun 2015-04-06 09:39:38

+0

據我瞭解,你排序列表,但沒有過濾。您必須迭代排序的列表並檢查當前元素是否在給定的價格範圍內。還有一個由Collections2提供的過濾方法。 – Ria 2015-04-06 09:45:01

回答

4
btnSearch.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View v) { 
// TODO Auto-generated method stub 

Integer objMin = new Integer(editMin.getText().toString()); 
Log.d("min:", String.valueOf(objMin)); 
Integer objMax = new Integer(editMax.getText().toString()); 
Log.d("max:", String.valueOf(objMax)); 

ArrayList<Home> temp_arraylist = new ArrayList<Home>(); 

for (int i = 0; i < arrayList.size(); i++) { 

int price = (Integer.parseInt(arrayList.get(i).getPrice().replace(",", ""))); 

if(price >= objMin && price <= objMax){ 
temp_arraylist.add(arrayList.get(i)); 
} 

} 

adapter = new HomeAdapter(getApplicationContext(), R.layout.adapter_home, temp_arraylist); 
listview.setAdapter(adapter); 

} 
}); 

並比較對象的數組列表..看到此鏈接http://beginnersbook.com/2013/12/java-arraylist-of-object-sort-example-comparable-and-comparator/

+0

什麼Collections.sort(temp_arraylist);會在這裏做? – NarendraJi 2015-04-06 11:30:23

+0

檢查我提供的鏈接..我給出了一個選項,如果萬一他想排序列表.. – 2015-04-06 11:31:35

+1

@DroidWormNarendra你知道collection.sort ?,我的意思是這個方法會做什麼? – Dev 2015-04-06 11:33:47

0

首先,我建議你使用minHeaps來存儲數據,其中,如果與比較給出在上述情況下,值將自動按升序排序和你不必每次用戶點擊排序。

現在,當你有兩個最大值和最小值,你可以簡單地得到第一個元素大於MIN和最後一個元素比最大從minHeap較小的指數。現在,迭代和範圍內獲取值


檢查了這一點

String min = editMin.getText().toString(); 
String max = editMax.getText().toString(); 

PriorityQueue<Home> queue = 
     new PriorityQueue<Home>(10, comparator); 

//To get the range, 
Book bookArray[] = new Book[queue.size()]; 
int minIndex,maxIndex; 
for(int i=0;i<queue.size();++i){ 
    if(bookArray[i] < min){ 

     continue; 
    } 
    minIndex= i; 
    break; 
} 
for(int i=minIndex;i<queue.size();++i){ 
    if(bookArray[i] < max){ 

     continue; 
    } 
    maxIndex= i-1; 
    break; 
} 
ArrayList toUseArray = new ArrayList<Book>[maxIndex-minIndex+1]; 
for(int i = minIndex; i< maxIndex +1;++i){ 
    toUseArray.add(bookArray[i]); 
} 

//Now you have all the elements within that range 


// Have this comparator class as an inner class or a separate class. 
public class comparator implements Comparator<String> 
{ 
    @Override 
    public int compare(Home arg1, Home arg2) 
    { 
     // Assume neither Home object is null. 
     Integer obj1 = new Integer(arg1.getPrice().replace(",", "")); 
     Integer obj2 = new Integer(arg2.getPrice().replace(",", "")); 
     return (obj2).compareTo(obj1); 
    } 
} 

不滿意嗎?

+0

我需要解決方案...你能告訴我的方式,因爲你知道我有兩個編輯文本,其中我接受用戶的價值觀,並希望顯示記錄列表 – Sun 2015-04-06 09:53:49

0

如果您使用的是Java 8則可以用字符串做過濾。如果沒有,那麼你可以簡單地通過集合進行迭代,並選擇在價格範圍的元素

List<Home> homes = ... 
int from = 3, to = 6; 

// JAVA 8 
List<Integer> filtered = homes.stream().filter(x -> { 
    int price = new Integer(x.getPrice().replace(",", "")); 
    return price >= from && price <= to; 
}).collect(Collectors.toList()); 

// Simple filtering with for loop 
List<Integer> filtered = new ArrayList<>(); 
for (Home home : homes) { 
    int price = new Integer(home.getPrice().replace(",", "")); 
    if (price >= from && price <= to) 
     filtered.add(x); 
} 
1

由於Home是你的類,並且從ArrayList<Home>您將需要過濾的結果來發表您的Home類,但是讓我們假設Home一些Bean類用與其相應的方法稱爲pricesetPrice()getPrice()

首先讓店內所有price值在一個單獨的ArrayList<Integer>

List<Integer> prices = new ArrayList<Integer>(); 
for(Home m : arraylist){ 
    prices.add(m.getPrice()); 
} 

現在排序上面的列表;

Collections.sort(prices); 
現在

你將有一個排序的列表,從2個值獲取範圍,做這樣的事情:

int minByUser = 28000; 
int maxByUser = 40000; 

List<Integer> temporary = new ArrayList<>(); 


    if(prices.contains(minByUser) && prices.contains(maxByUser)){ 
     prices.subList(prices.indexOf(minByUser), prices.indexOf(maxByUser)); // display this sublist 
    } 

    else{ 

     for(int num : prices){ 
      if(num >= minByUser && num <= maxByUser){ 
      temporary.add(num); 
      } 

     } 
    } 

    System.out.print(temporary); // for android you can Log to see the results before using the sublist in your ListView 

這樣你就會有值的用戶提供最小的範圍內和最大值。

+1

謝謝+1解釋:)我勾選爲有用 – Sun 2015-04-07 04:53:43

相關問題