• 今天写工具类时所犯的错误


    很感谢公司的大神,不厌其烦的进行指导,在大神的帮助下终于写完了。。

    写一个将时间段转换取并集合并的一个工具类,写了四五次,醉了

    第一次代码的问题在与:命名不规范,避免使用 String s 之类的,用有实际意义的命名

    修改后 第二次代码如下:

    public static List<String> union(List<String> period) {
    List<String> resultPeriod = new ArrayList<String>();

    for(int i = 0;i < period.size();i++){
      if (period.get(i) == null) continue;
      String[] outerPeriods = period.get(i).split("-");
      Arrays.sort(outerPeriods);
      for(int j = 0;j < period.size();j++){
        if (period.get(j) == null) continue;
        String[] innerPeriod = period.get(j).split("-");
        Arrays.sort(innerPeriod);
        // if (strs1[0].equals(strs2[0]) && strs1[1].equals(strs2[1])) continue;
        if (outerPeriods[0].compareTo(innerPeriod[1]) <= 0 && outerPeriods[1].compareTo( innerPeriod[0]) >= 0){
          String string = null;
          if (outerPeriods[0].compareTo(innerPeriod[0]) < 0){
            string = outerPeriods[0] + "-" + innerPeriod[1];
          }else{
            string =innerPeriod[0] + "-" + outerPeriods[1];
            }
          period.set(j, null);
          period.set(i, string);
          }
       } 
      if (period.get(i) != null)
      resultPeriod.add(period.get(i));
    }
    System.out.println(resultPeriod.toString());
    return resultPeriod;
    }

    第二次代码的问题在于: 对时间段进行比较,不要用字符串比较,最好转成时间或者时间戳进行比较,虽然字符串的ascii码比较也是没有问题的,尽量避免for循环里面 try-catch

    修改之后 第三次代码如下:

    public static List<String> union(List<String> period) {
      List<String> resultPeriod = new ArrayList<String>();
      for(int i = 0;i < period.size();i++){
        if (period.get(i) == null) continue;
        Long[] outerDate = getTimestamp(period.get(i).split("-"));
        Arrays.sort(outerDate);
        for(int j = i;j < period.size();j++){
          if (period.get(j) == null) continue;
          Long[] innerDate = getTimestamp(period.get(j).split("-"));
          Arrays.sort(innerDate);
          Long outerStart = outerDate[0];
          Long outerEnd = outerDate[1];
          Long innerStart = innerDate[0];
          Long innerEnd = innerDate[1];

          if (outerStart.equals(innerStart) && outerEnd.equals(innerEnd)) continue;
          if (outerStart.compareTo(innerEnd) <= 0 && outerEnd.compareTo(innerStart) >= 0){
            String mergeRes;
            if (outerStart.compareTo(innerStart) < 0){
              mergeRes = getDate(outerStart) + "-" + getDate(innerEnd);
            }else{
              mergeRes =getDate(innerStart) + "-" + getDate(outerEnd);
             }
            period.set(j, null);
            period.set(i, mergeRes);
           }
          }
          if (period.get(i) != null)
          resultPeriod.add(period.get(i));
        }
        System.out.println(resultPeriod.toString());
        return resultPeriod;
      }
    }

    public static Long[] getTimestamp(String[] periods){
      Long[] date = new Long[2];
      try{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        for(int i = 0 ; i < periods.length ; i++){
        date[i] = sdf.parse(periods[i]).getTime();
        }
      } catch (ParseException e) {
        e.printStackTrace();
      }
      return date;
    }

    public static String getDate(Long timestamps){
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
      return sdf.format(timestamps);
    }

    第三次代码的问题在于: 使用的两次for循环进行比较,而且会在循环的时候更改数据,最好不要在循环的时候改数据,而且可以通过一次循环实现此需求

    修改之后的第四次代码如下:

    public static List<String> union(List<String> period) {
      Collections.sort(period);
      List<String> resultPeriod = new ArrayList<String>();
      for(int i = 0;i < period.size();i++){
        if(i == period.size() - 1){
        resultPeriod.add(period.get(i));
        continue;
      }
      Long[] frontTimes = getTimestamp(period.get(i).split("-"));
      Long[] behindTimes = getTimestamp(period.get(i+1).split("-"));
      Long frontStart = frontTimes[0];
      Long frontEnd = frontTimes[1];
      Long behindStart = behindTimes[0];
      Long behindEnd = behindTimes[1];

      if (frontStart.compareTo(behindEnd) <= 0 && frontEnd.compareTo(behindStart) >= 0){
        String mergeRes = getDate(frontStart) + "-" + getDate(behindEnd);
        period.set(i+1, mergeRes);
      }else{
        resultPeriod.add(period.get(i));
        }
      }
      System.out.println(resultPeriod.toString());
      return resultPeriod;
    }

    第四次代码的问题在于: 1.依然有对原集合进行修改的操作,尽量避免;2.工具类一般不处理异常,直接抛出去;3.SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");会耗费很长的时间,最好不要在for循环里面操作,但是也最好不要写成静态的,因为SimpleDateFormat是线程不安全的,static多个线程共享一个某些时候回出现问题,具体参考(http://www.cnblogs.com/zemliu/archive/2013/08/29/3290585.html);4.由于不认真导致简单的代码错误

    第五次修改代码如下:

    public static List<String> union(List<String> period) throws ParseException{
      Collections.sort(period);
      List<String> resultPeriod = new ArrayList<String>();
      String currentPeriod = period.get(0);
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

      for(int i = 0;i < period.size();i++){
        Long[] currentTimes = getTimestamp(currentPeriod.split("-"), sdf);
        Long[] nextTimes = getTimestamp(period.get(i).split("-"), sdf);
        Long currentStart = currentTimes[0];
        Long currentEnd = currentTimes[1];
        Long behindStart = nextTimes[0];
        Long behindEnd = nextTimes[1];

        if (currentEnd < behindStart){
          resultPeriod.add(currentPeriod);
          currentPeriod = period.get(i);
        }else {
          List<Long> timePoints = new ArrayList<Long>();
          timePoints.add(currentStart);
          timePoints.add(currentEnd);
          timePoints.add(behindStart);
          timePoints.add(behindEnd);
          Collections.sort(timePoints);
          currentPeriod = getDate(timePoints.get(0)) + "-" + getDate(timePoints.get(timePoints.size() - 1));
          }
         }
         resultPeriod.add(currentPeriod);
         return resultPeriod;
       }

       private static Long[] getTimestamp(String[] periods, SimpleDateFormat sdf) throws ParseException{
       Long[] date = new Long[periods.length];
       for(int i = 0 ; i < periods.length ; i++){
       date[i] = sdf.parse(periods[i]).getTime();
      }
      return date;
    }

    private static String getDate(Long timestamps){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
    return sdf.format(timestamps);
    }

    大神说马马虎虎可以提交了

  • 相关阅读:
    使 Asp.net Core Hosting Bundle 立即生效
    Hosted Services require keep alive
    VS 高级保存选项,解决文件内容编码问题
    asp.net core localhost https 证书
    阿里云K8S下玩.NET CORE 3.1
    cmd 域名生效检测
    c# 通过win32 api 得到指定Console application Content
    .net framework msbuild环境搭建 (不装vs)
    Python常用模块——目录
    Python——爬虫进阶
  • 原文地址:https://www.cnblogs.com/zhangqian27/p/7647909.html
Copyright © 2020-2023  润新知