繁体   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