[英]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.