我正在制定折扣要求,用户应根据订单金额给予折扣。
例如,
订购1000至5000件商品 - 享受10%折扣
订购5000至10000件商品 - 享受15%的折扣
订购10000至15000件商品 - 享受20%折扣
这些是我在数据库中的详细信息。
根据订单金额查找折扣百分比的最佳方法是什么。我已经尝试在对象列表中设置它们并迭代它们并找到它所属的范围,然后获得该百分比。
但这似乎是一个漫长的过程。如果有更好的方法,请告诉我。
答案 0 :(得分:0)
这是我的Java解决方案。完全同意,如果你想直接使用SQL。但不管怎样,这里有一些密码! :)
我会使用关键字" Amounts"的LinkedHashMap。有价值"折扣"。它是链接的,以便在您从最高到最低迭代时保持顺序。如果您的值为> =迭代键金额,则应用值Discount并退出循环。
Map<Integer,Integer> map = new LinkedHashMap<>();
public void discount() {
map.put(10000,20);
map.put(5000,15);
map.put(1000,10);
System.out.println(discount(11000));
System.out.println(discount(5100));
System.out.println(discount(1100));
System.out.println(discount(100));
}
private int discount(int value) {
for (Map.Entry<Integer,Integer> entrySet : map.entrySet()) {
if (value >= entrySet.getKey()) {
return entrySet.getValue();
}
}
return 0;
}
结果......(它假设10000以上的任何东西都是20%)
20
15
10
0
答案 1 :(得分:0)
使用数据库。假设它是SQL:
表DISCOUNTS
MIN MAX REDUCTION
--- --- -------
1000 5000 10
5001 10000 15
10001 150000 25
SQL查询
select reduction
from discounts
where @amount between MIN and MAX
答案 2 :(得分:0)
这是一个商业应用程序,您要编写还是只是一个示例应用程序?
以防万一,它只是一个示例应用程序: 为什么不实施 fallthrough 方法:
int getDiscount(int amount){
if (amount >= 10000 && amount <= 15000) return 20;
if (amount >= 5000) return 15;
if (amount >= 1000) return 10;
return 0;
}
专业:
<强> N 强>:
首次重构:
int getDiscount(int amount){
if (isDiscountGroupA) return 20;
if (isDiscountGroupB) return 15;
if (isDiscountGroupC) return 10;
return 0;
}
bool isDiscountGroupA(int amount){
if (amount >= 10000 && amount <= 15000) return true;
}
bool isDiscountGroupB(int amount){
if (amount>5000) return true;
}
bool isDiscountGroupC(int amount){
if (amount>1000) return true;
}
<强>临强>
<强>缺点:强>
第二次重构:
public enum DiscountRanges {
DISCOUNTGROUPAUPPERBOUND(15000),
DISCOUNTGROUPALOWERBOUND(10000),
DISCOUNTGROUPBLOWERBOUND(5000),
DISCOUNTGROUPCLOWERBOUND(1000);
private final int boundary;
DiscountRanges(int boundary) { this.boundary=boundary; }
public int getValue() {return boundary;};
}
因此DiscountRanges.GROUPCLOWERBOUND.getValue()
为您提供C组的价值。
<强>临强>:
<强> N 强>:
JAVA8解决方案:
public class DiscountCalculator {
Map<Predicate<Integer>, Integer> rules=new LinkedHashMap<Predicate<Integer>, Integer>();
Integer getDiscount(int amount){
Optional<Integer> o= rules
.entrySet()
.stream()
.filter(x->x.getKey().test(amount))
.map(x->x.getValue())
.findFirst();
return (o.isPresent())?o.get():0;
}
public DiscountCalculator() {
rules.put(x -> x >= 10000 && x < 15000, 20);
rules.put(x -> x >= 5000, 15);
rules.put(x -> x >= 1000, 10);
}
}
<强>临强>:
lambdas
,你可以自由地设计复杂的谓词,而不仅仅是检查边界;例如您可以包含modulo-arithmetic
来创建更复杂的比例。代码可能比设计复杂查询更好。<强> N 强>:
但如果这些范围已经在数据库中,则根本不需要对它们进行硬编码。
如果您已经拥有数据库中的条件(以易于查询的方式),@ Dave的答案最符合您的需求:只需从数据库中选择即可。