Java 找到一个数字的范围的最佳方法是什么?
我正在研究一个折扣要求,用户应该根据订单金额获得折扣 比如说, 订购1000至5000件商品-给予10%的折扣 订购5000至10000件商品-给予15%的折扣 订购10000至15000件商品-给予20%的折扣 这些是我数据库中的详细信息 根据我的订单金额找到折扣百分比的最佳方法是什么。我试着在一个对象列表中设置它们,然后迭代它们,找到它所属的范围,然后得到那个百分比Java 找到一个数字的范围的最佳方法是什么?,java,Java,我正在研究一个折扣要求,用户应该根据订单金额获得折扣 比如说, 订购1000至5000件商品-给予10%的折扣 订购5000至10000件商品-给予15%的折扣 订购10000至15000件商品-给予20%的折扣 这些是我数据库中的详细信息 根据我的订单金额找到折扣百分比的最佳方法是什么。我试着在一个对象列表中设置它们,然后迭代它们,找到它所属的范围,然后得到那个百分比 但这似乎是一个漫长的过程。请告诉我是否有比这更好的方法。这是我的Java解决方案。如果您想直接使用SQL,请完全同意。但不管怎
但这似乎是一个漫长的过程。请告诉我是否有比这更好的方法。这是我的Java解决方案。如果您想直接使用SQL,请完全同意。但不管怎样,这里有一些代码!:) 我会使用带有“折扣”值的关键“金额”的LinkedHashMap。它是链接的,所以当您遍历它时,它会保持从最高到最低的顺序。如果您的值>=迭代密钥数量,则应用值折扣并中断循环
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;
}
使用数据库。假设是SQL: 表
折扣
MIN MAX REDUCTION
--- --- -------
1000 5000 10
5001 10000 15
10001 150000 25
SQL查询
select reduction
from discounts
where @amount between MIN and MAX
这是一个商业应用程序,你要写还是只是一个示例应用程序 在这种情况下,它只是一个示例应用程序: 为什么不实现一个故障排除方法: 因此
DiscountRanges.GROUPCLOWERBOUND.getValue()
为您提供了组C的值
Pro:
- 幻数封装在枚举中
- 到目前为止还没有
公共类折扣计算器{
映射规则=新建LinkedHashMap();
整数折扣(整数金额){
可选o=规则
.entrySet()
.stream()
.filter(x->x.getKey().test(金额))
.map(x->x.getValue())
.findFirst();
返回(o.isPresent())?o.get():0;
}
公共折扣计算器(){
规则.put(x->x>=10000&&x<15000,20);
规则.put(x->x>=5000,15);
规则.put(x->x>=1000,10);
}
}
Pro:
- 因为它们是
,所以您可以自由地设计复杂的谓词,而不仅仅是检查边界;e、 g.您可以包括lambdas
,以创建更复杂的比例。也许编写代码要比设计复杂的查询好得多模算术
如果您在数据库中已经有了条件(以一种易于查询的方式),@Dave的答案最适合您的需要:只需从数据库中选择即可。金额和折扣%之间是否存在数学关系?如果您的数据库中有这些详细信息,为什么不直接查找它们并跳过列表/迭代部分呢?哦,我刚刚注意到数据库中有……可能使用了一些SQL:)我会让Hibernate或其他框架担心缓存问题,然后使用
从表中选择折扣,其中priceminPrice
oh,您使用了性能标签。您每秒申请的折扣是多少?:)初始化映射时:(1)建议声明的类型(左侧)是接口。(2) 无需在右侧指定泛型类型Map Map=newlinkedhashmap()
Oops,是的。我通常使用底图类型。只是一个“打字错误”
select reduction
from discounts
where @amount between MIN and MAX
int getDiscount(int amount){
if (amount >= 10000 && amount <= 15000) return 20;
if (amount >= 5000) return 15;
if (amount >= 1000) return 10;
return 0;
}
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;};
}
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);
}
}