[英]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;
}
}
如果您的月份字母数和空格相同,则可以执行以下操作:
使用指定月份的子字符串,例如:
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)
构造函数应只调用在同一方法调用中同时设置number
和month
的setter
。 直接在该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.