1

というメソッドを書いていgetThanksgivingます。それはそのまま機能し、はるかに大きなクラスの一部ですが、より効率的にする方法についてアドバイスが必要でした. このgetWeekDayメソッドは、ユーザーが入力した年の 11 月 1 日の曜日を返すだけです。

public String getThanksgiving(){
String a = getWeekDay(11, 1);
int offset = 0;

    if(a.equals("Friday")){
    offset = 7;
    }

    if(a.equals("Saturday")){
    offset = 6;
    }

    if(a.equals("Sunday")){
    offset = 5;
    }

    if(a.equals("Monday")){
    offset = 4;
    }

    if(a.equals("Tuesday")){
    offset = 3;
    }

    if(a.equals("Wednesday")){
    offset = 2;
    }

    if(a.equals("Thursday")){
    offset = 1;
    }   

 int date = 21 + offset;
 thanksgiving = "Thursday, November " + date; 

 return thanksgiving;
}

for ループとして書き直そうとしましたが、うまくいきません。

public String getThanksgiving(){
String a = getWeekDay(11, 1);
int offset = 8;

String[] wTable = {"Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"};
    for(int i = 1; i < 8; i++){
        if(a.equals(wTable[i - 1])){
        offset --; 
        }
    }
 }

また、オフセットと 21 の加算というアイデアは、私の先生が私たちにやりたいと思っていることです。前もって感謝します!

4

4 に答える 4

1

あなたはスイッチケースを使用することができます

お気に入り

switch(a )

{
   case "Monday":
    offset = 4;
    break;

  case "Tuesday":
    offset = 3;
    break;

}

参照

switch(n)
{
case 1:
  execute code block 1
  break;
case 2:
  execute code block 2
  break;
default:
  code to be executed if n is different from case 1 and 2
}
于 2012-11-11T19:57:45.780 に答える
0

「より効率的」(つまり、実行時のパフォーマンス)にすることはできないと思います。コードをより読みやすく短くしたい場合は、ほとんどそこにいると思います

String[] wTable = {null, "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday", "Saturday", "Friday"};
for(int i = 1, n = wTable.lenght; i < n; i++) {
    if(a.equals(wTable[i])){
        offset = i;
        break; 
    }
}
于 2012-11-12T21:03:53.163 に答える
0

「このメソッドをより効率的にする方法」に関する質問に具体的に対処するために、注意すべきことの 1 つはif、解決策が既に見つかっている場合でも、メソッドがすべてのステートメントを評価することです。「ベアボーン」Java if を使用して、この方法でその日がいつ検出されたかを確認する条件を追加できます。

int offset = 0;
boolean found = false;
if(!found && a.equals("Friday")){
    offset = 7;
    found = true;
}

if(!found && a.equals("Saturday")){
    offset = 6;
    found = true;
}

このフラグは、(and) 演算子のショートカット評価によって実行時間をわずかに短縮し&&、一致が見つかるまで文字列比較のみを実行します。一致する要素が見つかった場合は、 for と using を使用breakしてループから抜け出すことで、同様のパフォーマンス結果を得ることができます。

より良い代替手段は、Map データ構造を使用することです。

Map<String, Integer> daysByOffset = new HashMap<String,Integer>();
// this 'setup' part you only do once
daysByOffset.put("Friday", 7);
daysByOffset.put("Saturday", 6);
...

次に、ハッシュマップのルックアップは O(1) であるため、ルックアップ部分は非常に効率的です。

int offset = daysByOffset.get(day);

洗練された代替手段は、オフセット情報をカプセル化する列挙型を使用することです。

public enum DaysWithOffset {
    FRIDAY(7), SATURDAY(6),..., THURSDAY(1);
    private final offset;
    private DaysWithOffset(int offset) {
        this.offset = offset;
    }

    public int getOffset() {
        return offset;
    }
}

列挙型が定義されると、各列挙型定数には対応するオフセット情報が含まれます。

FRIDAY.getOffset() // = 7

提供された文字列から列挙型を解決し、そこからオフセット値を求めることで、オフセットを計算できます。

...
String a = getWeekDay(11, 1);
int offset = DaysWithOffset.valueOf(day.toUpperCase()).getOffset();
...

どちらのオプションがより効率的かという問題に戻ると、map と enum の両方に O(1) ルックアップがあります (Enum ルックアップは、最適化された内部 enum 辞書によってわずかに改善されています。ただし、enum 操作には toUpperCase() が必要ですが、一方でこれらのオプションは両方とも、if のリスト (元のバージョン) や for ループよりもはるかに優れたパフォーマンスを発揮します。

これらのオプションは、回答を完全なものにするためと、Java 言語が提供する可能性の「プレビュー」を表示するために含めています。

ティーザー: Scala でこれを行う場合、次のように記述します: val daysByOffset = Map("Friday" -> 7, "Saturday" -> 6,...,"Thursday" ->1) def thanksGiving(day:String):String = "11月木曜日" + (daysByOffset(day)+21)

今、私が言語を学んでいるとしたら、それは Scala でしょう。

于 2012-11-12T22:09:48.450 に答える
0

これはどう?

private final static Map<String, int> dayMap = new HashMap<String,int>() 
{
dayMap.put("Monday", 0);
// do for the rest
};

in your method:

public String getThanksgiving(){
    String a = getWeekDay(11, 1);
    //do a lookup
    int result = dayMap.get(a);
    // do somthing with it. and return
    return "blah "+ result;
}
于 2012-11-12T22:15:06.060 に答える