编程指派一年的月份

时间:2014-01-12 15:05:04

标签: java substring variable-assignment

我正在接受一些编程练习的训练,这让我很忙。它说:

您的工作是将数字1,2,3,...,12转换为相应的月份名称1月,2月,3月,...,12月。实现一个类,其构造函数参数是月份编号,其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;
}
}

6 个答案:

答案 0 :(得分:3)

如果您拥有相同数量的月份加上空格,您可以执行以下操作:

  1. 寻找当月最长的名字。
  2. 使用空格填写月份的所有其他名称以使用相同数量的字母。 字母最多的月份是九月。其中有9个字母
  3. 使用具有给定月份数的子字符串,如:

    number = 0 = January
    number = 1 = February
    number = 11 = December
    
  4. 然后,您可以使用以下字符串从字符串中提取月份名称:

    substring(number*9, number*9+9)
    

答案 1 :(得分:2)

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];
}

我建议使用一个字符串数组,而不是一个很长的字符串并尝试从中拉出子字符串,每个索引都是表示月份名称的字符串。

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

例如,"January"位于0数组的索引months。因此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)构造函数应该只调用setter,并在同一方法调用中设置numbermonth。在setter中直接获取该逻辑,然后在需要设置/更改月份编号/名称时调用该setter。这将使月份的数量和名称保持同步(应该这样做)。

这里的重点是,您的getName()方法不应超过return month;month应在此课程的其他位置设置和维护。

注意:作为最后一个,最后一个注释......如果你真的,真的必须使用子串(我不会写那个代码,因为在这个例子中它真的不切实际,只对做作业很有用......)我会计算nth大写字母并将该索引中的子字符串返回到它后面的第一个空格字符的索引。

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

将其视为“J F M A M J J A S N D”。想要8个月吗? “J F M A M J J A”。你找到了第8个大写字母,它有任何索引。因此,返回该索引与该字符后面找到的第一个空格的索引之间的字符。在这种情况下,你将返回“八月”。

答案 2 :(得分:1)

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

    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|||..."其中|是sapace,因此所有名称都具有相同的长度。然后获取月份名称,您可以使用:

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

答案 3 :(得分:0)

由于类的方法不是静态的,我假设你有每个Month的实例,你提供它作为构造函数参数,每个月的数量。

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

本质上,HashMap映射键/值对。你可以把它想象成一本字典。每个单词都是一个键,与之关联的值是定义。例如,“计算机”一词是字典中的一个键,与之相关的值是“计算机”一词的定义。

考虑到这一点,Month类的设计可能是预先加载了键/值对的static HashMap,例如1 ='1月',2 ='二月',等等。

然后,

getName()将根据构造函数中传递的月份数检索存储的映射值。

例如:

public String getName()
{

       return hashMap.get(number);

}

答案 4 :(得分:0)

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字符串。

答案 5 :(得分:0)

  

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

如果不允许数组,条件(if,switch / case),可能毕竟需要固定长度的月份:通过一点数学运算,您可以计算子串的参数(起始端指数)