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

为了专门解决您关于“如何使这种方法更有效”的问题,需要注意的一点是,if即使在您已经找到解决方案的情况下,该方法也会评估每个语句。使用'bare bone' 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;
}

由于&&(and) 运算符的快捷评估,此标志将略微减少运行时间,仅执行字符串比较直到找到匹配项。break当您找到匹配的元素时,您可以使用 for 和 using 来实现类似的性能结果。

更好的选择是使用 Map 数据结构:

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

然后查找部分非常有效,因为在 hashmap 中查找是 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) 查找,(通过优化的内部枚举字典,枚举查找稍微好一点。然而,枚举操作需要 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 回答