Java-找到休息日(详细思路及注释)
记录一下做练习题“找到休息日”的思路,练习题目如下:
找到休息日:某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休息有几天.(注:首次休息日是 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-找到休息日(详细思路及注释)相关推荐
- Java找到休息日问题
Java找到休息日问题 核心知识 日历类:Calendar 时间类:SimpleDateFormat.Date 集合类:ArrayList 字符串类:StringBuilder(不安全的) 问题描述: ...
- 罗密欧与朱丽叶的迷宫问题(java版带有详细分析与注释)
罗密欧与朱丽叶的迷宫问题 问题描述 罗密欧与朱丽叶的迷宫问题 罗密欧与朱丽叶身处一个 $m×n $的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这 m × n m×n m×n 个房间中有一些房间 ...
- 如何快速理解java水仙花数 详细思路讲解
该博客专为小白提供,如是有基础可跳过中间部分,之间观看最后部分(中间废话我都觉得多了点 ) 一.首先,我们要了解水仙花数是一个什么概念的数. 水仙花数(Narcissistic number)也被称为 ...
- JAVA正则表达式(详细,转载内容)
可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式.正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性.在Unix世界里,正则表达式几乎没有 ...
- 详细聊聊Javadoc注释规范
Javadoc 注释规范 1. 注释分类 2. Java文档和Javadoc 3. 文档注释的格式 3.1 文档和文档注释的格式化 3.2 文档注释的三部分 4. 使用Javadoc标记 4.1 ...
- 黑马旅游网项目详细思路和完整代码整理 -附源码
黑马旅游网项目详细思路和完整代码整理 前言 由于新冠病毒的原因,无法上学.百无聊赖下自己开始看视频学习,跟着视频做完了这个项目来检验学习成果,顺便写篇博客来记录一下. 话不多说,开始正题. 文档及其源 ...
- Java 语法规定之外的命名注释规范
Java 语法规定之外的命名注释规范 命名规范 1. 项目名 2. 包名 3. 类名 4. 常量名 5. 变量名 6. 方法名 8. 其它命名技巧 9. 应当避免的行为 10. 经典的命名法 11. ...
- linux php和java环境变量配置_java_linux配置java环境变量详细过程,直接上实现过程:
一. 解压安 - phpStudy...
linux配置java环境变量详细过程 直接上实现过程: 一. 解压安装jdk在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-lin ...
- 使用HTML注释标签,超详细的HTML !–…– 注释标签使用实例.pdf
超详细的HTML 超详细的HTML 注释标签使⽤实例 HTML 注释标签 标签定义及使⽤说明 < !--...--> 注释标签⽤来在源⽂档中插⼊注释.注释不会在浏览器中显⽰. 您可使⽤注释 ...
最新文章
- 水质php202169,基于php的水质查询api调用代码实例
- OpenCV在图像上画线、矩形、椭圆、多边形、填充的多边形、圆、显示文字
- 读书越多会越孤独吗?
- Sharepoint学习笔记—ECM系列—1 Content Type Syndication
- Prototype(原型原型链)
- tomcat 使用log4j 管理日志
- 【LeetCode】【HOT】240. 搜索二维矩阵 II(抽象二叉搜索树)
- 地板之间出现缝隙如何处理?
- android abrc 9.png,android从sdcard加载.9.png图片
- 基于AI的网易UI自动化测试方案与实践
- java 中的匿名内部类
- scrapy的name变量_scrapy 如何设置全局变量?
- 【IT项目管理】第5章 习题
- 仿淘宝、腾讯课堂评分组件 --- Android高级自定义组件
- 网络编程 upd 发送接收数据
- vim yank 命令
- 安装MySQL过程中,出现“Staring the server”错误的解决方法
- 华为运营商级路由器配置示例 | 公网IPv4 over SRv6 TE Policy
- Elasticsearch+Kerberos认证
- 字符串数组大写小写互相转换