2015-04-06 69 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

相关问题