繁体   English   中英

年度编程作业月份

[英]Programming assignment month's of the year

我正在进行一些编程练习,这使我忙了很长时间。 它说如下:

您的工作是将数字1,2,3,...,12转换为相应的月份名称January,February,March,...,December。 实现类Month,其构造函数参数为月号,其getName方法返回月名称。 提示:编写一个很长的字符串“ January February March ...”,在其中添加空格,以使每个月的名称具有相同的长度。 然后使用子字符串提取所需的月份。

不幸的是,我每个月都没有制作相同数量的空格,但是如果我认为数字能够通过,那应该不是问题。

现在我还没有使用switch语句。 我将在不久的将来了解它。 使此分配有些棘手的是,我无法使用数组,开关,if / for循环。 请记住,我必须遵循文本中的提示。 我不能简单地使用文字,而是需要制作1个大字符串并在月份中返回子字符串。

问题是:如何将数字连接到特定的子字符串? 帮助赞赏!

这是我的代码:

public class Month
{
private int number;
private String month;

public Month(int theNumber)
{
    number = theNumber;
}

public String getName()
{
    String month = "January February March April May June July August September October November December";
    String january = month.substring(0,7);//January
    String february = month.substring(8,16);//February
    String march = month.substring(17,22);//March
    String april = month.substring(23,28);//April
    String may = month.substring(29,32);//May
    String june = month.substring(33,37);//June
    String july = month.substring(38,42);//July
    String august = month.substring(43,49);//August
    String september = month.substring(50,59);//September
    String october = month.substring(60,67);//October
    String november = month.substring(68,76);//November
    String december = month.substring(77,84);//December        
    return month;
}
}

如果您的月份字母数和空格相同,则可以执行以下操作:

  1. 寻找月份的最长名称。
  2. 用空格填充月份的所有其他名称,使它们具有相同数量的字母。 字母最多的月份是9月。 有9个字母
  3. 使用指定月份的子字符串,例如:

     number = 0 = January number = 1 = February number = 11 = December 

然后,您可以使用以下代码从字符串中提取月份的名称:

substring(number*9, number*9+9)
public String getName(int m) {

    if(m < 1 || m > 12) {
        throw new IllegalArgumentException("Invalid month number.");
    }

    String months[] = {"January","February","March","April","May",
        "June","July","August","September","November","December"}

    return months[m-1];
}

我建议不要使用大而长的String并尝试从中提取子字符串,而是建议使用String数组,每个索引都是代表月份名称的字符串。

原始方法的主要问题在于,您没有接受一个参数来告诉您应该返回哪个月份的名称。 我发布的代码已经修改了您的getName()方法,现在要求一个代表月份数字的int ,并且应该返回一个代表该月份名称的String。

例如, "January"位于months数组的索引0 因此getName(1)将返回"January"


编辑:注意到user1274223的答案...我实际上建议这样做...

由于您的班级名为Month并且方法是非静态的,因此我们假定班级的每个实例都代表一个单数月。 在这种情况下,我将修改您的两种方法...

首先,您的getName()方法可以看起来像这样:

public String getName() {
    return month;
}

但是现在您应该修改构造函数。

public Month(int m) {
    number = m;
    month = // logic to set the value of the string variable month, whether you use my array or a switch or whatever
}

实际上,理想情况下,您的Month(int m)构造函数应只调用在同一方法调用中同时设置numbermonthsetter 直接在该setter获取该逻辑,然后在需要设置/更改月份编号/名称时随时调用该setter。 这将使月份的数字和名称保持同步(应该这样做)。

实际上,这里的重点是您的getName()方法应该不超过return month; month应该在本课程的其他地方设置和维护。

注意:作为最后的最后一点……如果您确实需要,则必须使用子字符串(并且我不会编写该代码,因为在这种情况下,这确实不切实际,仅对完成家庭作业有用...)计数到第nth大写字母,然后将子索引从该索引返回到其后的第一个空格字符的索引。

区分大写字母和小写字母很容易,而且月份中都没有空格。 这是一个以空格分隔的月份名称索引。

认为它是“ JFMAMJJASND”。 想要第8个月? “ JFMAMJJA”。 您找到了第8个大写字母,该字母将具有任何索引。 因此,返回该索引与该字符之后的第一个空格的索引之间的字符。 在这种情况下,您将返回“ August”。

好吧,如果您将月份名称存储在单独的对象(字符串)中,则不需要以下行:

    String month = "January February March April May June July August September October November December";

要返回月份名称,只需使用switch语句:{

switch(number){
case 1: return january;
case 2: return february;
//etc
default : throw new RuntimeException("Invalid month number: " + number);
}

编辑:作为nhgrif建议您可以简单地返回字符串文字: return "January"

EDIT2:您可以使用字符的数量不变每个月名称: String months = "January|||February|||..."哪里| 是空格,因此所有名称的长度均相等。 然后要获得月份名称,可以使用:

String name = months.substring(number*nameLength, number*nameLength + nameLength).trim();

由于该类的方法不是静态的,因此我假设您有每个Month实例,这些实例作为构造函数参数(每个月的数量)提供。

如果您还没有了解Java HashMap类,那么这将是一个不错的起点。 我鼓励您学习如何使用它以及它如何工作。

本质上, HashMap映射键/值对。 您可以将其视为字典。 每个单词都是一个键,与之关联的值是定义。 例如,单词“计算机”是字典中的关键字,与之关联的值是单词“计算机”的定义。

考虑到这一点, Month类的设计可能是要有一个static HashMap ,它预先装有键/值对,例如1 ='January',2 ='February',依此类推。

然后,getName()会根据在构造函数中传递的月份号来检索存储的地图值。

例如:

public String getName()
{

       return hashMap.get(number);

}
public class Month {
    private static final String ALLMONTHS = "January February March April May June July August September October November December";
    private String myMonth;

/**
 * Constructor for objects of class Month
 */
public Month(int monthNumber) {
    switch(monthNumber) {
    case 1: myMonth = ALLMONTHS.substring(0,7); break;
    case 2: myMonth = ALLMONTHS..substring(8,16); break;
    //
    //  Continue cases 3,4,5...default
    //
    }
}

public String getName() {
    return myMonth;
}

}

我使用的是所有月份的单个静态字符串,在构造函数中使用开关分配myMonth字符串,然后您的getName()仅返回myMonth字符串。

请记住,我正在第3章中进行分配,在该分配中,不允许使用if / for循环的数组。

如果不允许使用数组,条件(例如,开关/大小写),那么毕竟可能需要固定的月份长度:借助一点数学,您就可以计算子字符串的参数(起始结束索引)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM