簡體   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