Java 拼多多砍一刀案例(集合方法解决)

业务需求:

完成拼多多砍一刀接口开发:

 

 

需求说明: (认真看需求分析)

完成如上砍一刀功能接口开发,用户点击‘帮好友砍一刀’,进行砍价。

需求分析:

1.用户点击 ‘帮好友砍一刀’ 给该用户砍掉部分金额。

2.每个用户只能砍价一次。 不得多次砍价

3.当金额为0时,砍价失败。

4.建议先思考写,写完,再看需求效果图

业务提示:

1.模拟一个初始需要砍价的用户的名称,和砍价金额, 总金额。 (建议用对象表示)

2.用户点击,进行金额随机减少,并且记录砍价用户和砍价金额。(记录砍价用户信息和砍价金额也建议使用对象存储)

3.展示砍价信息。。如上图:需要展示 被砍人金额,相差金额。。。砍价人以及金额 信息

扩展增强业务需求:

按照实际砍价业务需求,在极端情况下有可能一个用户直接砍价结束,防止这个问题可以设定为砍价人数必须达到某个阈值才能砍价成功。(假设阈值= 30 那么也就是必须砍价人数达到30才能砍价成功,也就是最后一个人直接砍完剩下的金额即可)

 

需求效果图:

输入砍价用户进行随机金额砍价

 

相同用户不能重复砍价

 

 

 

砍价金额达到需要,结束砍价

 

 

 

 

代码:

/**
* 被砍用户
*/
public class BKUser {

   private String name;

   private int sumMoney; //总金额

   private int bkMoney; //已砍金额

   @Override
   public String toString() {
       return "BKUser{" +
               "name='" + name + '\'' +
               ", sumMoney=" + sumMoney +
               ", bkMoney=" + bkMoney +
               '}';
  }

   public BKUser() {
  }

   public BKUser(String name, int sumMoney, int bkMoney) {
       this.name = name;
       this.sumMoney = sumMoney;
       this.bkMoney = bkMoney;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public int getSumMoney() {
       return sumMoney;
  }

   public void setSumMoney(int sumMoney) {
       this.sumMoney = sumMoney;
  }

   public int getBkMoney() {
       return bkMoney;
  }

   public void setBkMoney(int bkMoney) {
       this.bkMoney = bkMoney;
  }
}



/**
* 砍价用户
*/
public class KUser {

   private String name;
   private int kMoney;     //double 出现精度丢失   BigDecimal 麻烦 微信支付方法:以分单位

   public KUser(String name, int kMoney) {
       this.name = name;
       this.kMoney = kMoney;
  }

   public KUser() {
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public int getkMoney() {
       return kMoney;
  }

   public void setkMoney(int kMoney) {
       this.kMoney = kMoney;
  }

   @Override
   public String toString() {
       return "KUser{" +
               "name='" + name + '\'' +
               ", kMoney=" + kMoney +
               '}';
  }

   @Override
   public boolean equals(Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;

       KUser kUser = (KUser) o;

       if (kMoney != kUser.kMoney) return false;
       return name != null ? name.equals(kUser.name) : kUser.name == null;
  }

   @Override
   public int hashCode() {
       int result = name != null ? name.hashCode() : 0;
       result = 31 * result + kMoney;
       return result;
  }
}



/**
* 业务代码
*/
public class Demo {
   public static void main(String[] args) {
       Scanner scanner = new Scanner(System.in);
       Random rm  = new Random();
       int count  = 3000; //保证砍价金额,太小得问题
       Set<KUser> sets = new HashSet<>();
       //1.模拟一个被砍用户
       BKUser bkUser = new BKUser("张三",8000,0);
       while(true){
//相差金额 剩余得钱
           int sMoney = bkUser.getSumMoney() - bkUser.getBkMoney();
           if(sMoney <= 0){
               System.out.println("砍价结束.....");
               break;
          }
           //2.砍价图形界面模拟出来
           System.out.println("****************************************");
           System.out.println("****************************************");
           System.out.println("已砍"+bkUser.getBkMoney()/100.00+",还差"+ sMoney / 100.00+"元");
           System.out.println("------------------>砍价帮<-------------------");
           for (KUser set : sets) {
               System.out.println(set.getName()+"-----砍掉"+set.getkMoney()/100.00);
          }
           System.out.println("是否砍价(输入砍价得用户名):");
           //获得砍价得用户名
           String name = scanner.next();
           //3.判断是否砍过了。
           boolean flag = false;
           for (KUser set : sets) {
               if(name.equals(set.getName())){ //这个用户已经砍过价格了
                   System.out.println("已经砍过价格了");
                   flag = true;
              }
          }
           if(flag){  //这个用户已经砍过价格了 进入到下一次砍价
               continue; //进入到下一次砍价
          }
           //拓展:如果砍价得人到30了。那么就直接砍完
           if(sets.size() + 1 == 30){  //如果判断成功,代表此人就是最后一个
               int kMoney = sMoney;
               bkUser.setBkMoney(bkUser.getBkMoney() + kMoney);
               sets.add(new KUser(name,kMoney));
               System.out.println("砍价成功:"+name+"为"+bkUser.getName() +"砍掉" +kMoney / 100.00+ "元");
          }else {
               //4.生成砍价得金额 生成得金额,是从0开始,所以保证不能出现0得问题
               int kMoney = rm.nextInt(sMoney - count)+1;
               count -= 100;
               //4.1 增减被砍用户得金额   bkUser.getBkMoney() 已砍金额
               bkUser.setBkMoney(bkUser.getBkMoney() + kMoney);
               //4.2记录砍价用户得信息 防止用户重复砍价
               sets.add(new KUser(name,kMoney));
               System.out.println("砍价成功:"+name+"为"+bkUser.getName() +"砍掉" +kMoney / 100.00+ "元");
          }
      }
  }
}
 

 

posted @ 2022-05-16 21:27  Aginbak  阅读(1899)  评论(0编辑  收藏  举报