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