如何使这种方法更有效?

时间:2012-11-11 19:55:29

标签: java loops for-loop

所以我正在编写一个名为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 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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; 
    }
}

答案 2 :(得分:0)

要专门解决有关“如何提高此方法效率”的问题,需要注意的一点是,即使在您找到解决方案的情况下,该方法也会评估每个if语句。使用'裸骨'java如果你可以添加一个条件来检查何时以这种方式找到它:

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<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 a = getWeekDay(11, 1);
int offset = DaysWithOffset.valueOf(day.toUpperCase()).getOffset();
...

回到关于哪个选项更有效的问题,map和enum都有一个O(1)查找,(优化的内部枚举字典使Enum查找略好一些。但是,枚举操作需要一个toUpperCase( ),虽然地图没有)这两个选项都会比if(原始版本)或for循环列表好很多。

我提供了这些选项以完整答案,并且您可以“预览”Java语言提供的可能性。

现在是一个预告片:如果你在Scala中这样做,你会写这样的东西: val daysByOffset =地图(“星期五” - > 7,“星期六” - &gt; 6,...,“星期四” - &gt; 1) def thanksGiving(day:String):String =“Thursday,November”+(daysByOffset(day)+21)

如果我今天学习一门语言,那就是Scala。

答案 3 :(得分: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;
}