记录一下做练习题“找到休息日”的思路,练习题目如下:

找到休息日:某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休息有几天.(注:首次休息日是 2020 年 2 月 2 日)

如何找到休息日:为休息日设置一个数组,从首次休息日2020年2月2日开始,每3天休息一天,也就是在首次休息的基础上加上四天,这第四天就是下一次休息日,将这一天放入数组中,用循环语句直到找到1000个休息日(可改,设置1000只是为了不让程序陷入无限循环)并存入数组中,这样我们只需要将输入的yyyy年MM月的每一天都与休息日数组对比一次,若能在数组中找到说明这一天是休息日。

判断是否是休息日(在首次休息日的基础上加四,将其放入数组中并返回布尔值):

/**@Description  从2020年2月2日开始,每三天返回一个true代表是休息日* @param input*@Return boolean*@Author 非常颜小姐*Date Created in 2020/7/23 16:17**/private static boolean workDay(String input) throws ParseException {Calendar calendar = new GregorianCalendar();//设置年为2020calendar.set(Calendar.YEAR, 2020);//设置月为2(系统认定月份为0-11月)calendar.set(Calendar.MONTH, 1);//设置日期为2calendar.set(Calendar.DATE, 2);//将休息日放入动态数组list1里面List<String> list1 = new ArrayList<>();//找到i个休息日的数量并将每个休息日放入list1中for (int i = 0; i < 1000; i++) {//把日期拼接成一个"yyyyMMdd"形式的字符串dateint getYearByC = calendar.get(Calendar.YEAR);String getMonthByC = String.valueOf(calendar.get(Calendar.MONTH+1));String getDateByC = String.valueOf(calendar.get(Calendar.DATE));//将得到的日历月份格式设置为两位数形式,例如2月设置为02月,若为12月则不变if (calendar.get(Calendar.MONTH+1) < 10) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("0");stringBuilder.append(getMonthByC);getMonthByC = stringBuilder.toString();}//将得到的日历日数格式设置为两位数形式,例如2日设置为02日,若为21日则不变if (calendar.get(Calendar.DATE) < 10){StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("0");stringBuilder.append(getDateByC);getDateByC = stringBuilder.toString();}//将获得的年月日拼接成字符串StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(getYearByC);stringBuilder.append(getMonthByC);stringBuilder.append(getDateByC);//date = a+b+c = “yyyyMMdd"String date = stringBuilder.toString();//用simpleDateFormat.parse方法将"yyyyMMdd"字符串格式的date转为date对象d(date时间格式)SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");Date d = simpleDateFormat.parse(date);//用simpleDateFormat.format方法将date对象d(date时间格式)转为"yyyy年MM月dd日"字符串格式的timeSimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy年MM月dd日");String time = simpleDateFormat1.format(d);//该日期是休息日,将休息日放入list1中list1.add(time);//从首次休息日2020年2月2日起,每4天休息一次calendar.add(Calendar.DATE, 4);}//判断输入的字符串是否在集合中,在就返回truereturn list1.contains(input);}

如何判断休息日是否是周末并计算出其天数:通过Calendar类来根据日期判断星期几(周日是1,周六是7),只要在是休息日的基础上又满足为周末的条件,则轮到周末休息的天数加一。

if (workDay(time)) {//若time为休息日则为其加上[]//StringBuilder节省内存StringBuilder stringBuilder1 = new StringBuilder();stringBuilder1.append("[");stringBuilder1.append(newDay);stringBuilder1.append("]");newDay = stringBuilder1.toString();//统计休息日天数restNum++;//统计周日的休息天数if (calendar.get(Calendar.DAY_OF_WEEK)==1 || calendar.get(Calendar.DAY_OF_WEEK)==7){weekRestNum++;}

为了能够更好的进行日期之间的对比,需要将我们需要处理的年月日拼接成字符串`

/**@Description  将年月日拼接成字符串* @param*@Return java.lang.String*@Author 非常颜小姐*Date Created in 2020/7/23 16:18**/public static String StringBuilderYMD(){int getYearByC = calendar.get(Calendar.YEAR);String getMonthByC = String.valueOf(calendar.get(Calendar.MONTH+1));String getDateByC = String.valueOf(calendar.get(Calendar.DATE));//将得到的日历月份格式设置为两位数形式,例如2月设置为02月,若为12月则不变if (calendar.get(Calendar.MONTH+1) < 10) {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("0");stringBuilder.append(getMonthByC);getMonthByC = stringBuilder.toString();}//将得到的日历日数格式设置为两位数形式,例如2日设置为02日,若为21日则不变if (calendar.get(Calendar.DATE) < 10){StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("0");stringBuilder.append(getDateByC);getDateByC = stringBuilder.toString();}//将获得的年月日拼接成字符串StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(getYearByC);stringBuilder.append(getMonthByC);stringBuilder.append(getDateByC);//date = a+b+c = “yyyyMMdd"String date = stringBuilder.toString();return date;}

获取输入的年以及月

/**@Description 获取输入年份* @param*@Return int*@Author 非常颜小姐*Date Created in 2020/7/23 16:15**/public static int InputYear() {System.out.println("请输入年份(YYYY):");String inputYear = input.nextLine();int year = -1;try {year = Integer.parseInt(inputYear);} catch (NumberFormatException e) {}if (year < 1000 || year > 10000) {System.out.println("格式输入有误,请重新输入!");return InputYear();}return year;}/**@Description  获取输入的月份*@Return*@Author 非常颜小姐*Date Created in 2020/7/23 16:14**/public static int InputMonth() {System.out.println("请输入月份:");String inputMonth = input.nextLine();int month = -1;try {month = Integer.parseInt(inputMonth);} catch (NumberFormatException e) {}if (month < 1 || month > 13) {System.out.println("格式输入有误,请重新输入!");return InputMonth();}return month;}

输出休息天数以及轮到周末的休息天数

/**@Description 输入restNum和weekRestNum* @param null*@Return*@Author 非常颜小姐*Date Created in 2020/7/23 16:16**/private static void print() {System.out.println();System.out.println("本月休息天数有:" + restNum + "天");System.out.println("本月轮到周末休息天数有:" + weekRestNum + "天");}

主函数

public static void main(String[] args) throws ParseException {//获取输入的年份int year = InputYear();//获取输入的月份int month = InputMonth();//设置年calendar.set(Calendar.YEAR,year);//设置月(0-11月)calendar.set(Calendar.MONTH,month-1);System.out.print("星期日  星期一  星期二  星期三  星期四  星期五  星期六");//设置日期为1//获取该时间是星期几,星期日为1calendar.set(Calendar.DATE,1);int weekDay = calendar.get(Calendar.DAY_OF_WEEK);//根据星期几给日历集合加多少个空格for (int z=0; z<weekDay ;z++) {arr.add("    ");}//获取日历当月最大日期int maxDate = calendar.getActualMaximum(Calendar.DATE);for (int i=1; i<=maxDate; i++) {//设置日期为1-最大日期calendar.set(Calendar.DATE,i);//把日期拼接成一个字符串String date = StringBuilderYMD();//用simpleDateFormat.parse方法将"yyyyMMdd"字符串的date转为date格式的时间格式SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");Date d = simpleDateFormat.parse(date);//用simpleDateFormat1.format方法把时间格式的d转换为”yyyy年MM月dd日"格式的字符串timeSimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy年MM月dd日");String time = simpleDateFormat1.format(d);//time = "yyyy年MM月dd日"//获取该日期int day = calendar.get(Calendar.DATE);//把日期转化为字符串String newDay = String.valueOf(day);//如果是time = "yyyy年MM月dd日"为休息日,则给time加上[]if (workDay(time)) {//若time为休息日则为其加上[]//StringBuilder节省内存StringBuilder stringBuilder1 = new StringBuilder();stringBuilder1.append("[");stringBuilder1.append(newDay);stringBuilder1.append("]");newDay = stringBuilder1.toString();//统计休息天数restNum++;//是周日的休息天数if (calendar.get(Calendar.DAY_OF_WEEK)==1 || calendar.get(Calendar.DAY_OF_WEEK)==7){weekRestNum++;}}else {StringBuilder stringBuilder1 = new StringBuilder();stringBuilder1.append(" ");stringBuilder1.append(newDay);stringBuilder1.append(" ");newDay = stringBuilder1.toString();}if (day<10) {StringBuilder stringBuilder1 = new StringBuilder();stringBuilder1.append(" ");stringBuilder1.append(newDay);newDay = stringBuilder1.toString();}arr.add(newDay);}//打印集合for (int j=0; j<arr.size(); j++) {//如果有7个数就换行System.out.print(arr.get(j)+"   ");if (j%7==0){System.out.println();}}print();}

最后附上运行图

Java-找到休息日(详细思路及注释)相关推荐

  1. Java找到休息日问题

    Java找到休息日问题 核心知识 日历类:Calendar 时间类:SimpleDateFormat.Date 集合类:ArrayList 字符串类:StringBuilder(不安全的) 问题描述: ...

  2. 罗密欧与朱丽叶的迷宫问题(java版带有详细分析与注释)

    罗密欧与朱丽叶的迷宫问题 问题描述 罗密欧与朱丽叶的迷宫问题 罗密欧与朱丽叶身处一个 $m×n $的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这 m × n m×n m×n 个房间中有一些房间 ...

  3. 如何快速理解java水仙花数 详细思路讲解

    该博客专为小白提供,如是有基础可跳过中间部分,之间观看最后部分(中间废话我都觉得多了点 ) 一.首先,我们要了解水仙花数是一个什么概念的数. 水仙花数(Narcissistic number)也被称为 ...

  4. JAVA正则表达式(详细,转载内容)

    可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式.正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性.在Unix世界里,正则表达式几乎没有 ...

  5. 详细聊聊Javadoc注释规范

    Javadoc 注释规范 1. 注释分类 2. Java文档和Javadoc 3. 文档注释的格式  3.1 文档和文档注释的格式化 3.2 文档注释的三部分 4. 使用Javadoc标记  4.1 ...

  6. 黑马旅游网项目详细思路和完整代码整理 -附源码

    黑马旅游网项目详细思路和完整代码整理 前言 由于新冠病毒的原因,无法上学.百无聊赖下自己开始看视频学习,跟着视频做完了这个项目来检验学习成果,顺便写篇博客来记录一下. 话不多说,开始正题. 文档及其源 ...

  7. Java 语法规定之外的命名注释规范

    Java 语法规定之外的命名注释规范 命名规范 1. 项目名 2. 包名 3. 类名 4. 常量名 5. 变量名 6. 方法名 8. 其它命名技巧 9. 应当避免的行为 10. 经典的命名法 11. ...

  8. linux php和java环境变量配置_java_linux配置java环境变量详细过程,直接上实现过程: 一. 解压安 - phpStudy...

    linux配置java环境变量详细过程 直接上实现过程: 一. 解压安装jdk在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-lin ...

  9. 使用HTML注释标签,超详细的HTML !–…– 注释标签使用实例.pdf

    超详细的HTML 超详细的HTML 注释标签使⽤实例 HTML 注释标签 标签定义及使⽤说明 < !--...--> 注释标签⽤来在源⽂档中插⼊注释.注释不会在浏览器中显⽰. 您可使⽤注释 ...

最新文章

  1. 水质php202169,基于php的水质查询api调用代码实例
  2. OpenCV在图像上画线、矩形、椭圆、多边形、填充的多边形、圆、显示文字
  3. 读书越多会越孤独吗?
  4. Sharepoint学习笔记—ECM系列—1 Content Type Syndication
  5. Prototype(原型原型链)
  6. tomcat 使用log4j 管理日志
  7. 【LeetCode】【HOT】240. 搜索二维矩阵 II(抽象二叉搜索树)
  8. 地板之间出现缝隙如何处理?
  9. android abrc 9.png,android从sdcard加载.9.png图片
  10. 基于AI的网易UI自动化测试方案与实践
  11. java 中的匿名内部类
  12. scrapy的name变量_scrapy 如何设置全局变量?
  13. 【IT项目管理】第5章 习题
  14. 仿淘宝、腾讯课堂评分组件 --- Android高级自定义组件
  15. 网络编程 upd 发送接收数据
  16. vim yank 命令
  17. 安装MySQL过程中,出现“Staring the server”错误的解决方法
  18. 华为运营商级路由器配置示例 | 公网IPv4 over SRv6 TE Policy
  19. Elasticsearch+Kerberos认证
  20. 字符串数组大写小写互相转换

热门文章

  1. FL Studio里一起安装的ASIO4ALL有什么用?
  2. 微信浏览器中,aler弹框不显示域名
  3. 鲁棒性、泛化 的解释和区别
  4. 发现谁用 kill -9 关闭程序就开除!
  5. 变电站机器人的控制部分
  6. 前端性能优化方案都有哪些?
  7. UglifyJS 新一代的Javascript压缩工具
  8. 图灵社区 : 阅读 : 十年码农聚会报道——让高龄老码农social起来
  9. 天刀手游测试服服务器维护中,谈谈天涯明月刀手游吧。 因为开测四天,今天我想上线维护中。...
  10. 关于Informatica的使用(转载)