从大整数列表生成 Java 的价格范围
Generate Price-Ranges in Java from Big-Integer-List
我有一个产品列表,其价格为 BigInteger。我想创建动态价格范围来过滤产品搜索,就像 google 在 google 上所做的那样。com/shopping:
如何根据给定的 items/prices 列表计算良好的动态价格范围?我尝试了 google 但找不到任何好的结果或任何解决方案!我 不想 想手动定义范围,只需将价格添加到给定范围....
感谢您的帮助!
您必须过滤您的产品,例如使用 Java 8 流媒体 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 等范围
这意味着您将需要 "round" 价格。您可以制作允许范围开始/结束的静态列表并寻找下一个最大范围结束:
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;
}
我有一个产品列表,其价格为 BigInteger。我想创建动态价格范围来过滤产品搜索,就像 google 在 google 上所做的那样。com/shopping:
如何根据给定的 items/prices 列表计算良好的动态价格范围?我尝试了 google 但找不到任何好的结果或任何解决方案!我 不想 想手动定义范围,只需将价格添加到给定范围....
感谢您的帮助!
您必须过滤您的产品,例如使用 Java 8 流媒体 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 等范围
这意味着您将需要 "round" 价格。您可以制作允许范围开始/结束的静态列表并寻找下一个最大范围结束:
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;
}