private static void sum(List<Record> data) {
int spring = 0, summer = 0, autumn = 0, winter = 0;
long start = (new Date()).getTime();
for (Record i : data) {
if (i.month >= 1 && i.month <= 3) {
winter += i.amount;
} else if (i.month >= 4 && i.month <= 6) {
spring += i.amount;
} else if (i.month >= 7 && i.month <= 9) {
summer += i.amount;
} else if (i.month >= 10 && i.month <= 12) {
autumn += i.amount;
}
}
long end = (new Date()).getTime();
System.out.println("winter:" + winter);
System.out.println("spring:" + spring);
System.out.println("summer:" + summer);
System.out.println("autumn:" + autumn);
System.out.println("time:" + (end - start));
} 以上代码的算法有效率上更优的么?
解决方案 »
- 在学习Swing过程中遇到的一个小问题,求高人解答!
- 在Hibernate里面的SessionFactory.getCurrentSession()与(Session)ThreadLocal.get()有什么区别。
- 在C盘下编译没问题,在E盘下编译就 error: cannot read是什么原因??
- 为什么java,c++方法里面传参数的时候只能传对象或者基本数据类型
- 怎样在swing上加图形
- 关于反射 -- Method 类的 setAccessible 方法的作用
- 何去何从?!
- 在jbuilder6下编applet运行通过,但在ie6。0中报如下错:java.lang.NoClassDefFoundError: com/borland/jbcl/layout/XYLayout,请高手指
- 请教:有关Java的数据计算的问题???
- 父类私有字段问题
- 对于押宝游戏出个题目
- 参数里经常出现 (A[]...) 这是什么意思
如果 month 已经在外边验证过不会大于 12
else if (i.month >= 10 && i.month <= 12)
就可以直接
else 了
毕竟判断一下还是要用点时间的
i.month 这个东西又多次访问到,可以实现提取出来:int month = i.month;
后面就访问month if else 块太多,现在有4个,以后可能会有5个6个... 尝试用多态来改,不然代码不好维护if()里面的条件尽量要少,现在有2个,以后可能有3个4个...
i.month >= 1 && i.month <= 3
换成
i.month <= 3 && i.month >= 1
其他类推
好像要快些
楼主试试
我测试了下看看int spring = 0, summer = 0, autumn = 0, winter = 0;
long start = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
if (i <= 3 && i >= 1) {
winter ++;
} else if (i <= 6 && i >= 4) {
spring ++;
} else if (i <= 9 && i >= 7) {
summer ++;
} else if (i <= 12 && i >= 10) {
autumn ++;
}
}
long end = System.currentTimeMillis();
System.out.println("winter:" + winter);
System.out.println("spring:" + spring);
System.out.println("summer:" + summer);
System.out.println("autumn:" + autumn);
System.out.println("time:" + (end - start)); start = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
if (i >= 1 && i <= 3) {
winter ++;
} else if (i >= 4 && i <= 6) {
spring ++;
} else if (i >= 7 && i <= 9) {
summer ++;
} else if (i >= 10 && i <= 12) {
autumn ++;
}
}
end = System.currentTimeMillis();
System.out.println("winter:" + winter);
System.out.println("spring:" + spring);
System.out.println("summer:" + summer);
System.out.println("autumn:" + autumn);
System.out.println("time:" + (end - start));测试结果:
winter:3
spring:3
summer:3
autumn:3
time:13602~~~~~~~~~~~~~~~~~~~~~~~~winter:6
spring:6
summer:6
autumn:6
time:17395第一种要快
就像是2 个for嵌套的话就把循环次数小的放在外围一样
至于算法一说我觉得没什么特殊的
spring:3
summer:3
autumn:3
time:11374
winter:6
spring:6
summer:6
autumn:6
time:8140
在我机器上是第二种快。
// 0 -- spring
// 1 -- summer
// 2 -- autumn
// 3 -- winter
int[] quarters = new int[4];
for (Record i : data) {
quarters[(i.month - 1) / 3] += i.amount;
}
System.out.println("winter:" + quarters[3]);
System.out.println("spring:" + quarters[0]);
System.out.println("summer:" + quarters[1]);
System.out.println("autumn:" + quarters[2]);
}
t0 = System.nanoTime(); // t0 = System.currentTimeMillis();
..........
t1 = System.nanoTime(); // t0 = System.currentTimeMillis();
System.out.println(t1 - t0);