从Big-Integer-List生成Java中的价格范围

时间:2016-02-22 18:08:14

标签: java dynamic range webshop price

我有一个产品列表,其价格为BigInteger。我想创建动态价格范围来过滤产品搜索,就像google在google.com/shopping上所做的那样:

dynamic price ranges from google shopping

如何从给定的商品/价格列表中计算出良好的动态价格范围?我试过谷歌,但根本找不到任何好结果或任何解决方案!我 NOT 想要手动定义范围,只需将价格添加到给定范围....

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您必须过滤您的产品,例如使用Java 8 Streaming API(如果Java 8可用):

List<Product> results = new ArrayList();    
products.stream().filter(p -> p.getPrice() > minPrice && p.getPrice() < maxPrice).forEach(results::add);

当然,在Stream结束时,您可以改为.forEach(this::output);

如果您需要支持旧版本,则等效的是for循环:

for(Product p : products){
   if(p.getPrice() > minPrice && p.getPrice() < maxPrice)
      this.output(p); //or add to a list
}

你当然可以把它作为一种方法包装起来:

public static List<Product> filterProducts(BigInteger minPrice, BigInteger maxPrice){
   List<Product> results = new ArrayList();    
   products.stream().filter(p -> p.getPrice() > minPrice && p.getPrice() < maxPrice).forEach(results::add);
   return results;
}

查找范围

如果您有30个项目要分成3个范围,您希望您的范围是最低价格 - 介于第十个最低价格和第十一个最低价格之间。

让我们假设您已经按照某种方式对列表进行了排序:

double[] calcRanges(List<Product> sortedProducts, int count){
    double result = new double[count + 1];
    result[0] = 0;
    for(int i = 1; i < result.length; i++) {
        int pos = (sortedProducts.getSize() * i) / count;
        result[i] = sortedProducts.get(pos).getPrice();
    }
}

问题是,你会得到2.99 - 3.49 / 3.49 - 12.35等范围。

这意味着你需要&#34; round&#34;价格。您可以制作允许范围开始/结束的静态列表,并寻找下一个最大范围结束:

double[] allowedRangeEnds = {0,1,5,10,20,50,100,200,500,1000,2000,5000,10000};

//returns the smalles allowed rangeend which is > value
double getNextRangeEnd(double value){
    int i = 0;
    while(allowedRangeEnds[i] < value && i < allowedRangeEnds.length - 1){
        i++;
    }
    return allowedRangeEnds[i];
}

您当然可以生成您的范围,以防您的价格飙升并且您不想改变您的静态范围:

List<Double> calcRangeEnds(double maxValue) {
    List<Double> result = new ArrayList<Double>();
    double base = 1;
    while(base / 2 <= maxValue) { //the last value added is base / 2
        result.add(base);
        result.add(base * 2);
        result.add(base * 5);
        base *= 10;
    }
    return result;
}