簡體   English   中英

如何使這種方法更有效?

[英]How to make this method more efficient?

所以我正在寫一個叫做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的想法只是我的老師希望我們做的。 提前致謝!

你可以用開關盒

喜歡

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
}

我認為您無法使其“更加高效”(即運行時性能)。 如果您想使代碼的 可讀性 更短,我想您就快到了

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

為了專門解決有關“如何使這種方法更有效”的問題,需要注意的一件事是,即使已經找到了解決方案,該方法也會評估每個if語句。 使用'bare bones'java if's,可以添加條件來檢查何時以這種方式找到日期:

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

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

該標志將通過&& (和)運算符的快捷方式評估來略微減少運行時間,僅執行字符串比較,直到找到匹配項為止。 當找到匹配的元素時,可以使用for並使用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中解析枚舉並從中查詢偏移值來計算偏移量:

...
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 =“十一月星期四” +(daysByOffset(day)+21)

如果我今天正在學習一門語言,那就應該是Scala。

這個怎么樣?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM