java 求 问 怎么在选定的日期内得到最合适的酒店程序

图片说明

0

3个回答

就是一些if判断,这个很简单

0

看完需求,我大体思路如下:

一 需要抽象的对象:客户等级,客户等级价格,酒店,酒店销售策略,酒店星级,一周天数区间(因为是一周某几天对应一个价格,所以区间是一个对象)
二 以上对象的关系大体应该如下:
酒店应该有多种销售策略,因为工作日和周末的销售价格不一样,因此
图片说明

销售策略应该包含一个天数区间和多个客户等级价格,因为某一个策略对应的是一周的几天,并且不同的客户等级对应的价格也不一样,因此
图片说明

客户等级价格,应该包含一个客户等级和一个对应的价格,比如会员50元,普通客户100元,因此
图片说明

天数区间应该包含多个天数
图片说明

三.根据以上抽象的对象可以大体总结如下计算最优酒店的算法思路。
-输入:客户等级,开始时间,结束时间
-输出:酒店
1. 循环所有酒店,根据开始时间和结束时间还有客户等级算出每个酒店对应的价格,并且按照价格由低到高排序
2. 再按照酒店星级由高到低排序
3. 最后取第一个酒店即可

四.代码如下(代码主要采用Java8的流和新时间API,代码风格可能比较飘逸,请记得把JDK升到8)

测试类:

 public class HotelTest {

    public static void main(String[] args) {
        test(CustomerLevel.NORMAL, LocalDate.of(2009, 3, 16), LocalDate.of(2009, 3, 18));
        test(CustomerLevel.VIP, LocalDate.of(2016, 7, 31), LocalDate.of(2016, 8, 02));
    }

    public static void test(CustomerLevel customerLevel, LocalDate startDate, LocalDate endDate){
        Hotel hotel = HotelSelector.chooseCheapest(customerLevel, startDate, endDate);
        System.out.println(customerLevel.getName() + " " + startDate + "-" + endDate + "的最终选择的酒店:" + hotel.getName());
    }
}

执行结果:

图片说明

主体代码依次如下:

酒店类:

 @Getter
@AllArgsConstructor
public enum Hotel {

    // 如家
    HomeInn("如家", HotelStar.THREE, Arrays.asList(
            SaleStrategy.days(DaysInterval.wordDays).customerLevelPrices(
                    CustomerLevelPrice.level(CustomerLevel.NORMAL).price(110), CustomerLevelPrice.level(CustomerLevel.VIP).price(80)),
            SaleStrategy.days(DaysInterval.weekend).customerLevelPrices(
                    CustomerLevelPrice.level(CustomerLevel.NORMAL).price(90), CustomerLevelPrice.level(CustomerLevel.VIP).price(80))
    )),
    // 七天
    SevenDaysInn("七天", HotelStar.FOUR, Arrays.asList(
            SaleStrategy.days(DaysInterval.wordDays).customerLevelPrices(
                    CustomerLevelPrice.level(CustomerLevel.NORMAL).price(160), CustomerLevelPrice.level(CustomerLevel.VIP).price(110)),
            SaleStrategy.days(DaysInterval.weekend).customerLevelPrices(
                    CustomerLevelPrice.level(CustomerLevel.NORMAL).price(60), CustomerLevelPrice.level(CustomerLevel.VIP).price(50))
    )),
    // 汉庭
    HanTing("汉庭", HotelStar.FIVE, Arrays.asList(
            SaleStrategy.days(DaysInterval.wordDays).customerLevelPrices(
                    CustomerLevelPrice.level(CustomerLevel.NORMAL).price(210), CustomerLevelPrice.level(CustomerLevel.VIP).price(100)),
            SaleStrategy.days(DaysInterval.weekend).customerLevelPrices(
                    CustomerLevelPrice.level(CustomerLevel.NORMAL).price(150), CustomerLevelPrice.level(CustomerLevel.VIP).price(40))
    )),
    ;

    // 酒店名字
    private String name;

    // 酒店星级
    private HotelStar hotelStar;

    // 酒店的销售策略集合
    private List<SaleStrategy> saleStrategies;

    public Integer getHotelStarValue(){
        return this.hotelStar.getStarValue();
    }

    /**
     * 根据一个集合的天数和客户等级算出所有天数该酒店的价格和
     * @param dayOfWeekStream
     * @param customerLevel
     * @return
     */
    public Integer getPrice(Stream<DayOfWeek> dayOfWeekStream, CustomerLevel customerLevel){
        return dayOfWeekStream.map(dayOfWeek -> this.getPriceByDayOfWeek(dayOfWeek, customerLevel)).reduce(Integer::sum).get();
    }

    /**
     * 根据当前的天数和客户等级,获取这一天,这个酒店的价格
     * @param dayOfWeek
     * @param customerLevel
     * @return
     */
    private Integer getPriceByDayOfWeek(DayOfWeek dayOfWeek, CustomerLevel customerLevel){
        return this.saleStrategies.stream().filter(saleStrategy -> saleStrategy.getDaysInterval().contain(dayOfWeek))
                                           .findFirst()
                                           .map(saleStrategy -> saleStrategy.getCustomerLevelPrice(customerLevel))
                                           .map(CustomerLevelPrice::getPrice)
                                           .get();
    }
}

酒店星级:

 @Getter
@AllArgsConstructor
public enum HotelStar {

    ONE(1),
    TWO(2),
    THREE(3),
    FOUR(4),
    FIVE(5);

    private Integer starValue;
}

酒店销售策略:

 @Getter
@Setter
public class SaleStrategy {

    // 当前销售策略适应的天数区间
    private DaysInterval daysInterval;

    // 不同客户等级对应的价格集合
    private List<CustomerLevelPrice> customerLevelPrices;

    public static SaleStrategy days(DaysInterval daysInterval){
        return new SaleStrategy(daysInterval);
    }

    public SaleStrategy customerLevelPrices(CustomerLevelPrice ... customerLevelPrices){
        this.customerLevelPrices = Arrays.asList(customerLevelPrices);
        return this;
    }

    public CustomerLevelPrice getCustomerLevelPrice(CustomerLevel customerLevel){
        return this.customerLevelPrices.stream().filter(customerLevelPrice -> customerLevelPrice.getCustomerLevel().equals(customerLevel)).findFirst().get();
    }

    private SaleStrategy(DaysInterval daysInterval) {
        this.daysInterval = daysInterval;
    }
}

天数区间:

 public class DaysInterval {

    // 包含的一周哪些天
    private List<DayOfWeek> days;

    // 工作日区间(包括周一,周二,周三,周四,周五)
    public static DaysInterval wordDays = of(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY, DayOfWeek.THURSDAY, DayOfWeek.FRIDAY);

    // 周末区间(包括周六,周日)
    public static DaysInterval weekend = of(DayOfWeek.FRIDAY, DayOfWeek.SUNDAY);

    public static DaysInterval of(DayOfWeek ... dayOfWeeks){
        return new DaysInterval(Arrays.asList(dayOfWeeks));
    }

    public boolean contain(DayOfWeek dayOfWeek){
        return this.days.contains(dayOfWeek);
    }

    private DaysInterval(List<DayOfWeek> days) {
        this.days = days;
    }
}

客户等级价格:

 @Getter
public class CustomerLevelPrice {

    // 客户等级
    private CustomerLevel customerLevel;

    // 对应的价格
    private Integer price;

    public static CustomerLevelPrice level(CustomerLevel customerLevel){
        return new CustomerLevelPrice(customerLevel);
    }

    public CustomerLevelPrice price(Integer price){
        this.price = price;
        return this;
    }

    private CustomerLevelPrice(CustomerLevel customerLevel) {
        this.customerLevel = customerLevel;
    }
}

客户等级:

 @Getter
@AllArgsConstructor
public enum CustomerLevel {
    // 普通客户
    NORMAL("普通客户"),
    // VIP客户
    VIP("会员客户");

    private String name;
}

酒店选择器:

 public class HotelSelector {

    /**
     * 根据当前客户级别,和客户准备入住酒店的开始时间和结束时间,筛选出当前最便宜的酒店
     * @param customerLevel
     * @param startDate
     * @param endDate
     * @return
     */
    public static Hotel chooseCheapest(CustomerLevel customerLevel, LocalDate startDate, LocalDate endDate){
        return Arrays.stream(Hotel.values())
                     // 先按照每个酒店的最终价格升序排列
                     .sorted(Comparator.comparing((Hotel hotel) -> hotel.getPrice(createStream(startDate, endDate), customerLevel))
                             // 若价格相等,再按照每个酒店的星级降序排列
                             .thenComparing(Comparator.comparing(Hotel::getHotelStarValue).reversed()))
                     // 排列后取第一个即可
                     .findFirst().get();

    }

    /**
     * 将入店开始时间和离店时间转化为天数的流,方便后续计算
     * @param startDate
     * @param endDate
     * @return
     */
    public static Stream<DayOfWeek> createStream(LocalDate startDate, LocalDate endDate){
        return Stream.iterate(startDate, localDate -> localDate.plusDays(1))
                     .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
                     .map(LocalDate::getDayOfWeek);
    }
}

五. 之所以有这么多的类,主要方便扩展,当前可快速扩展的点有:
1.销售区间可扩展,可自由选择周一到周末的任意几天为天数区间
2.客户等级可扩展,可扩展普通用户,黄金用户,白金用户等,不同用户也可以设置不同的价格

最后,本来代码在idea里写的挺漂亮的,不知道贴出来看着却这么丑...哎...

0

这个我觉的如果要实现完全达到自动化,这可能需要使用大数据知识让程序自动去判断吧!!!!

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java 求两个日期间的工作日(无周六日)
参数: 开始日期 结束日期 string 返回值:int
计算一段日期内的周末天数(星期六,星期日总和)
/* | Author: Yang Yu | @param char|int $start_date 一个有效的日期格式,例如:20091016,2009-10-16 | @param char|int $end_date 同上 | @return 给定日期之间的周末天数
酒店管理系统之日结帐界面(swing)
[code=&quot;java&quot;] package com.mwq.frame.check_out; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt...
plsql查询起始日期间的所有日期
 select start_date + level-1 myday from dual connect by start_date+level-1   
分别统计周期时间内数量
以年/月/日为周期,分别统计周期时间内数量 ##订单表order订单创建时间create_time现需要统计”每天有多少订单生成”SELECT COUNT(order_id) AS total, FROM_UNIXTIME(create_time,&quot;%d&quot;) AS day_num FROM order GROUP BY day_num 1234(1).FROM_UNIXTIME函数,可将时间戳格式...
自定义酒店日期选择器
自定义酒店日期选择器 自定义日期区间选择器,类似于途家等酒店、旅游日期区间选择器: 重写PopupWindow 制定区间日历 添加日历日期选中监听 *封装插件化 github开源 CustomDatePicker l类似于途家等酒店日期选择器,弹出自定义的PopupWindow,监听日期选中,返回结果。代码已经开源到GitHub上,提供插件化。 —— [ Wiki ]...
JAVA获取某段时间内的所有日期
import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; public class FindDates {  public static void main(String[
算法提高 日期计算 蓝桥杯 详解
算法提高 日期计算   时间限制:1.0s   内存限制:256.0MB      问题描述   已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。 输入格式   输入只有一行   YYYY MM DD 输出格式   输出只有一行   W 数据规模和约定
网上酒店客房预定系统(java版,含数据库)
网上酒店客房预定系统(java版,含数据库) 基于struts的网上客房预定系统 毕业设计作品 就不包括论文了
j2me电话簿案例源码
j2me电话簿案例源码 求问:怎么在真机上使得程序开始运行时显示的是midlet6而不是现在的这个?
程序判断2018年8月14日是星期几
import java.util.Calendar; public class Zuoye3 { public static void main(String[] args) { Calendar c=Calendar.getInstance(); c.set(2019,2,17); int date=c.get(Calendar.DAY_...
酒店、出行等日期的选择
自己常用的2个时间选择器,感觉还可以,主要是避免可很多麻烦,不用去判断日期的起始,可查看天数可以自由选择快捷时间。 类型一: 类型二: 大家喜欢的话可以用用试试,下载压缩包即可,代码已经写好。http://download.csdn.net/download/ymm_0008/9856440
获取一段时间的字符串时间组
    /**     *  获取一段时间内所有日期     * @param begin 格式yyyy-MM-dd     * @param end 格式yyyy-MM-dd     * @return     */ public static List&amp;lt;String&amp;gt; findDates(String begin, String end) { SimpleDateFormat s...
计算两个日期之间的工作日天数
js计算两个日期之间的工作日天数
全球酒店详情查看API接口-基于极核数据
此接口可以根据城市名称查询全球酒店信息 1.根据城市查酒店 ·        接口地址:http://api.data-ranking.com/booking/search ·        支持格式:JSON ·        请求方式:GET ·        请求示例:http://api.data-ranking.com/booking/search?appkey=APP
Java 获取两个时间的时间查 如 1 天 2 小时 30 分钟
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { public static void main(String[] args) throws ParseException { SimpleDateFormat ...
案例-做一个酒店预定小程序用的日期选择案例
做一个酒店预定用的日期选择案例 不多说,先上效果图 设计思路:根据年份和月份构建最近6个月的日历,获取每个月的第一天是星期几,空白用空对象填充,每个月需要的格子数 = 每月1号的星期数 + 每月对应的天数。在HTML中遍历日期数据,根据条件判断高亮显示入住时间、离店时间以及两者之间的时间。一下是全部代码(优化在最后). &amp;amp;amp;amp;lt;!-- html代码 --&amp;amp;amp;amp;gt; &amp;amp;amp;amp;lt;view...
数据结构-马走日的解法
【题目来自灰灰考研】 (2018上海交通大学上机题)(2017华中科技大学上机题) 假设国际象棋棋盘有5*5共25个格子。设计一个程序,使棋子从初始位置(如图)开始跳马,需要将棋盘的格子全部都走一遍,每个格子只允许走一次。 问:总共有多少解。(提示:回溯法) P.S国际象棋的棋子是在格子中间的。国际象棋中的“马走日”,如下图2所示,第一步为[1,1],第二步为[2,8]或[2,12],第三...
java小程序:已知当前星期数,求若干天后是星期几。
分析:假设星期1,经过3天后星期4,经过7*n天后还是星期1(n是正整数);假设星期2,经过3天后星期5,经过7*n天后还是星期2(n是正整数),发现一个规律:当前星期数加上经过的天数之和对7取余,余数就是所求,当然了,设定0位星期日。代码如下: public class HomeWork02 { public static void getWeekDay(int initDay,int...
jquery 获取两个日期中的天数
Date.prototype.format=function (){ var s=''; s+=this.getFullYear()+'-';// 获取年份。 s+=(this.getMonth()+1)+"-"; // 获取月份。 s+= this.getDate(); // 获取日。 return(s);
java获取一段日期中的每一天
  Calendar c_begin = new GregorianCalendar();     Calendar c_end = new GregorianCalendar();     DateFormatSymbols dfs = new DateFormatSymbols();      String[] weeks = dfs.getWeekdays();      ...
根据起始及结束日期显示时间段内所有日期
这条SQL语句主要是用来显示某个时间段内的所有日期,有利于显示日期相关数据
日期插件,日历插件
一款强大的日期插件,只有你想不到的没有它没有的功能,
java简单酒店管理程序
Room类3个私有属性:房间编号,房间类型,房间状态 Initroom类对房间进行初始化和更改房间信息 package no4; import java.util.Scanner; public class Hotel{ public static void main(String[] args) { Scanner in = new Scanner(System.in); Sy
Python获取两时段内日期、月份、小时的列表清单
1、总体代码脚本/Users/nisj/PycharmProjects/BiDataProc/love/dateList.py# -*- coding=utf-8 -*- import warnings import datetime warnings.filterwarnings(&quot;ignore&quot;) def getNowDay(): DayNow = datetime.dateti...
算法提高 求最大值
算法提高 求最大值   时间限制:1.0s   内存限制:256.0MB      问题描述   给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大。并且要求你选定的数对的ai之和非负,bi之和非负。 输入格式   输入的第一行为n,数对的个数   以下n行每行两个整数 ai bi 输出格式   输出你
清算/报表/日终跑批程序之性能优化案例(一)
前言 不知不觉,技术人生系列·我和数据中心的故事来到了第五期。小y又和大家见面了! 前几期主要发了一些TroubleShooting的案例分享,其实小y最擅长的是性能优化,所以从这期开始,小y会陆续的分享更多的数据库性能优化案例。 进入正题,如果您的日终跑批/清算/报表等程序时快时慢,或者从某一天以后就一直变慢,作为运维DBA或开发的您,会怎么下手?还有,
获取两个日期之间的日期集合
获取两个日期之间的日期集合 如:2018-01-01和2018-60-01之间的所有日期集合,返回list<Date>
Java中日期和时间的获取
1.简单的获取日期的方法 import java.time.LocalDate; import java.time.LocalDateTime; public class GetDatatime { public static void main(String[] args) { LocalDateTime localdatetime=LocalDateTime.now();//新建一
//三、用程序判断2018年2月14日是星期几。
public class Demo03 { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR,2018); //month从0开始至11,代表1-12 ...
C 已知1900年1月1日是星期一,输入某年某月某日,求星期几
#include void main() { int y,m,d,n; int a[13],i,sum1,sum2,sum; scanf("%d%d%d",&y,&m,&d); sum1=0;sum2=d;sum=0; for(i=1900;i { if(i%4==0&&i%100!=0||i%400==0) n=366; else n=365; sum1=su
【oracle】获得两个日期之间的所有日期
SELECT A.REMARK_NAME, A.REMARK_START_DATE, A.REMARK_END_DATE, A.REMARK_START_DATE + B.DIS - 1 H FROM B_REMARK_DETAIL A, (SELECT ROWNUM DIS FROM (SELECT MAX
用程序判断2018年2月14日是星期几。
import java.util.Calendar; /* 用程序判断2018年2月14日是星期几。 */ public class Demo1 { public static void main(String[] args) { // 创建Calendar对象 Calendar cal = Calendar.getInstance(); ...
酒店订房小程序
酒店小程序demo,完整的订房系统,根据优惠日给出不一样的优惠价格,每天的价格随意后台订
java实现获取两个日期之间相隔的工作日天数
public static int workDays(String strStartDate, String strEndDate) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Calendar cl1 = Calendar.getInstance(); Calendar cl2
求问一个关于在某一段日期内查询的语句!!
我现在有如下表:rntable: voyagernfields: voy_no etarn SSS 20050102rn XXX 20041202rn TTT 20051108rnrn我想查询在给定的两个时间参数内的航次,应该如何写?rn谢谢各位大侠赐教!!!!!
JavaWeb酒店预订系统
JavaWeb酒店预订系统(Eclise + MySQL) 管理员模块、客户模块、房间模块、订单模块等功能 这都是我亲手做的,全完没问题的。暂停没有发现BUG
手把手教你使用python写提取快捷酒店房间信息的采集程序
自从过完年之后没有发过什么文章了,一直在写一个快捷酒店房间采集程序,现在已经做完了七天连锁的和如家的房间信息采集,现在会陆续将代码贴上来 我的python工程的目录如下图所示: 程序是使用python2.7+mongod+threadpool完成的,所以你还需要一个mongodb数据库和下载一个threadpool线程池库 一,我们首先在resources目录下放入两个个xml文件,第一
酒店小程序预定日期
求大神赐教
Java 集合 之 List 酒店房间管理实例
http://www.verejava.com/?id=1699454145722package com.hotel; import java.util.List; public class TestHotel { public static void main(String[] args) { //实例化酒店 Hotel h=new Hotel(&quot;汉庭快捷酒店&quot;,&quot;北京市朝阳区望...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 多少岁学习java最合适 问什么学习java