使用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类并以此方式计算天数。此赋值的目的是传达条件

最近,我在计算机科学初级班上收到了以下作业:

编写一个程序,要求用户输入一个月(1=一月,2=二月,和 依此类推),然后打印每月的天数。二月,打印 “28天”。 输入月份(1-12): 5. 31天 使用int getDays()方法实现类月份。不要使用单独的if或else 每月报表。使用布尔运算符

我不是要求某人完成上述任务,而是批评我自己的解决方案。在问这个问题之前,我做了一些基本的搜索,但是大多数(如果不是全部的话)解决方案都使用Calendar类并以此方式计算天数。此赋值的目的是传达条件语句和布尔运算符的思想

我的解决方案: Season.java

/**
 * @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。(请注意,链接到维基百科页面)虽然在某些情况下很有用,但要小心编写过于“聪明”的代码,这会成为阅读和维护的噩梦。