使用Java(使用布尔运算符)确定每月天数的最简洁方法
最近,我在计算机科学初级班上收到了以下作业: 编写一个程序,要求用户输入一个月(1=一月,2=二月,和 依此类推),然后打印每月的天数。二月,打印 “28天”。 输入月份(1-12): 5. 31天 使用int getDays()方法实现类月份。不要使用单独的if或else 每月报表。使用布尔运算符 我不是要求某人完成上述任务,而是批评我自己的解决方案。在问这个问题之前,我做了一些基本的搜索,但是大多数(如果不是全部的话)解决方案都使用Calendar类并以此方式计算天数。此赋值的目的是传达条件语句和布尔运算符的思想 我的解决方案: Season.java使用Java(使用布尔运算符)确定每月天数的最简洁方法,java,if-statement,boolean-logic,days,Java,If Statement,Boolean Logic,Days,最近,我在计算机科学初级班上收到了以下作业: 编写一个程序,要求用户输入一个月(1=一月,2=二月,和 依此类推),然后打印每月的天数。二月,打印 “28天”。 输入月份(1-12): 5. 31天 使用int getDays()方法实现类月份。不要使用单独的if或else 每月报表。使用布尔运算符 我不是要求某人完成上述任务,而是批评我自己的解决方案。在问这个问题之前,我做了一些基本的搜索,但是大多数(如果不是全部的话)解决方案都使用Calendar类并以此方式计算天数。此赋值的目的是传达条件
/**
* @author Jared Holley
* Date: 4/01/14
* Period: 3rd
*
* Write a program that asks the user to enter a month (1 = January, 2 = February, and
* so on) and then prints the number of days of the month. For February, print
* “28 days”.
*
* With a method int getDays(). Do not use a separate if or else
* statement for each month. Use Boolean operators.
*/
//31: 1,3,5,7,8,10,12
//30: 2,4,6,9,11
public class Month {
private int month;
/**
* The constructor for the Month class.
* Simply takes in a monthNumber and sets it to the
* class variable.
* @param monthNumber
*/
public Month(int monthNumber){
month = monthNumber;
}
/**
* The method that converts a month number into the number of days within that month.
* It first checks if the month is February so that it eliminates that from the following conditions that would produce a false positive.
* It then goes through and uses a rather odd conditional statement.
* The first half of the if statements increments all the months by one and checks if they are even.
* This would turn January into 2 which does have 31 days and trun April into 5 which has 30 days.
* The second half just checks the even months beyond 7.
* Lastly it will just return 30 otherwise.
* @return The numbers of days within the month.
*/
public int getDays(){
if(month == 2)return 28;
if( ((month + 1) % 2 == 0 && month < 9) || ((month % 2 == 0) && month >= 8)) return 31;
return 30;
}
}
/**
*@作者贾里德·霍利
*日期:2014年1月4日
*期间:3日
*
*编写一个程序,要求用户输入一个月(1=一月,2=二月,和
*依此类推),然后打印每月的天数。二月,打印
*“28天”。
*
*使用int getDays()方法。不要使用单独的if或else
*每月报表。使用布尔运算符。
*/
//31: 1,3,5,7,8,10,12
//30: 2,4,6,9,11
公课月{
私人整数月;
/**
*Month类的构造函数。
*只需输入一个月数并将其设置为
*类变量。
*@param monthNumber
*/
公众月(国际月数){
月=月数;
}
/**
*将月数转换为该月内天数的方法。
*它首先检查月份是否为2月份,以便从以下可能产生假阳性的情况中排除该月份。
*然后它遍历并使用一个非常奇怪的条件语句。
*if语句的前半部分将所有月份增加1,并检查它们是否相等。
*这将使1月变为2月,有31天,4月变为5月,有30天。
*下半年只检查7个月之后的偶数个月。
*最后,它将返回30,否则。
*@返回月内的天数。
*/
公共整数getDays(){
如果(月=2)返回28;
如果((月+1)%2==0和月<9)| |((月%2==0和月>=8))返回31;
返回30;
}
}
这个解决方案效果很好。我只是想知道是否有一种更优雅的方式来处理事情。我的条件语句看起来很难看。谢谢你的帮助 所有的路都向南走 但我认为你达到了任务的目标。在我看来,有更优雅的方法(也许更快,我想我需要做一些测量),比如使用
Map
s或enum
s,这样可以避免像这样丑陋的if
-else
语句
是的,
month
应该是最终的,因为您不打算在这个类中修改变量。是的,可以将其设置为private(当有疑问时,它始终是private)虽然这可能不是一个理想的答案,但下面的一行代码只使用一个布尔运算符(=),而且它很简洁
int daysInMonth = 31 - ((month == 2) ? 3 : ((month - 1) % 7 % 2));
此算法的解释可在此处找到(解决方案#3):
看起来确实很糟糕,但考虑到这项任务,我不确定你能提高多少。注意:您可以将
月份
定为最终日期。另外,month%2!=0
可能比(月+1)%2==0更清晰。谢谢!我很有信心它不能缩短。但是,我将做出您建议的更改,因为它似乎更容易理解我的推理。不要将month
设置为final,除非您希望该类是不可变的。如果您确实将month
final设置为public final
,因为它是一个原语。@jared IMO不变性应该是此类“value”类的默认值。我不知道你为什么认为它应该公开。@assylias为什么它不应该公开(如果它是最终的)?这就是我的理由,很有趣!我想知道你能否更深入地了解一下使用“Map”而不是条件句的想法。我是这个领域的新手,这让我非常感兴趣。我可以发布一些东西,但我必须承认,这并没有真正使这个特定的问题变得更简单,而是更复杂(以代码行衡量),同时它会更具可扩展性。(这是不必要的,因为总是会有12个月,而不是一个月:)看看,以获得一个概念的想法。它在处理动态输入时非常有用,而静态输入(比如几个月)没有多少好处(甚至没有更多的工作)。哇,这真的很有趣。我从来没有听说过这个?条件运算符。现在我知道了,我打算更多地使用它。我也注意到了作者在文章中提到的模式,但从未想过使用第%7个月来重新启动该模式。谢谢你的贡献!这是if-else的捷径:先是条件,然后是条件?(=if),然后一个Java语句后跟:(=else)再后跟一个Java语句(请参见)仅供参考,?:
语法称为a。(请注意,链接到维基百科页面)虽然在某些情况下很有用,但要小心编写过于“聪明”的代码,这会成为阅读和维护的噩梦。