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));
        
    } 以上代码的算法有效率上更优的么?

解决方案 »

  1.   

    没什么好优的了
    如果 month 已经在外边验证过不会大于 12 
     else if (i.month >= 10 && i.month <= 12)
    就可以直接
    else 了
    毕竟判断一下还是要用点时间的
      

  2.   

    大有优处:
    i.month 这个东西又多次访问到,可以实现提取出来:int month = i.month;
    后面就访问month if else 块太多,现在有4个,以后可能会有5个6个... 尝试用多态来改,不然代码不好维护if()里面的条件尽量要少,现在有2个,以后可能有3个4个...
      

  3.   

    你把你的判断语句里边的
    i.month >= 1 && i.month <= 3
    换成
    i.month <= 3 && i.month >= 1
    其他类推
    好像要快些
    楼主试试
      

  4.   

    算法没了
    我测试了下看看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第一种要快
      

  5.   

    这个作业的目的估计就是考这个
    就像是2 个for嵌套的话就把循环次数小的放在外围一样
    至于算法一说我觉得没什么特殊的
      

  6.   

    winter:3
    spring:3
    summer:3
    autumn:3
    time:11374
    winter:6
    spring:6
    summer:6
    autumn:6
    time:8140
    在我机器上是第二种快。
      

  7.   

        private static void sum(List<Record> data) {
            // 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]);
        }
      

  8.   

    你的计时方式有问题,把 new Date 的时间也纳入了计时操作中:改成这样:long t0, t1;
    t0 = System.nanoTime();  // t0 = System.currentTimeMillis();
    ..........
    t1 = System.nanoTime();  // t0 = System.currentTimeMillis();
    System.out.println(t1 - t0);