価格が BigInteger である製品のリストがあります。Google が google.com/shopping で行うように、動的な価格帯を作成して製品検索をフィルタリングしたいと考えています。
指定されたアイテム/価格のリストから適切な動的価格範囲を計算するにはどうすればよいですか? 私はグーグルを試しましたが、良い結果や解決策がまったく見つかりませんでした! 手動で範囲を定義したくなくて、指定された範囲に価格を追加するだけです....
私はあなたの助けに感謝します!
たとえば、Java 8 Streaming API (Java 8 が利用可能な場合) を使用して、製品をフィルタリングする必要があります。
List<Product> results = new ArrayList();
products.stream().filter(p -> p.getPrice() > minPrice && p.getPrice() < maxPrice).forEach(results::add);
もちろん、ストリームの最後に、.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;
}
範囲を検索
3 つの範囲に分割したい 30 個のアイテムがある場合、範囲を最低価格 (10 番目に低い価格と 11 番目に低い価格の間) にする必要があります。
リストを何らかの方法でソート済みであるとしましょう。
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 などの範囲が得られることです。
つまり、価格を「丸める」必要があります。許可された範囲の開始/終了の静的リストを作成し、次に大きい範囲の終了を探すことができます。
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;
}