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