连续字符串编号处理工具,拼接与计数

该代码实现了一个用于处理连续字符串编号的工具,包括排序和拼接计数功能。通过对给定字符串列表进行排序,然后检查连续编号,生成如0650200123494=1形式的结果,表示该编号出现的次数。如果存在断号,则会记录起始和结束编号,如0650201123456-8=3。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连续字符串编号处理工具,拼接与计数

 /**
   * 排序工具类(Java工具类,groovy不能保证可以适用)
   * @param list       目标集合,{startIndex}-{endIndex},每个元素该下标范围内必须是正确的数字不能是 0122
   * @param startIndex 6  subString.startIndex
   * @param endIndex  13  subString.endIndex
   * @return list.sort(Comparator.comparingInt(a -> ((int) a)));
   */
  public static List<String> sortStrList(List<String> list, Integer startIndex, Integer endIndex) {
      String aindex = list.get(0);
      int len = aindex.length();
      if (len < endIndex || len < startIndex) {
          throw new RuntimeException("集合排序List<String>,请检查元素长度:" + len + "," + startIndex + "," + endIndex);
      }
      list.sort(Comparator.comparing(b -> Integer.parseInt(b.substring(startIndex, endIndex))));
      return list;
  }

  /**
   * 连续字符串编号处理程序,拼接与计数
   * @param targetStr  example :"0650201123456,0650201123457,0650201123458,0650201123485,0650201123486,0650201123487,0650201123488,0650201123489,0650201123460,0650201123461,0650201123480,0650201123481,0650201123482,0650201123483,0650201123484,0650201123470,0650201123490,0650201123491,0650201123492,0650201123493,0650200123494";
   * @param startIndex 6  subString.startIndex
   * @param endIndex  13  subString.endIndex
   * @return {0650200123494=1, 0650201123456-8=3, 0650201123460-1=2, 0650201123470=1, 0650201123480-93=14}
   */
  public static Map<String,Integer> continuityStringNumberHandler(String targetStr, int startIndex, int endIndex){
      String[] strs = targetStr.split(",");
      List<String> strsList = Arrays.asList(strs);
      sortStrList(strsList, startIndex, endIndex);              //排序
//        log.info("strsList:" + strsList);
      Map<String, Integer> tempValue = new TreeMap<String, Integer>();    //最后的处理结果
      Iterator<String> iterator = strsList.iterator();                    //排序后的,迭代器
      String temp = "";                                                   // 临时交换为,用于连续号段,尾号处理
      String firstNumber = "";                                            //连续号段的首号
      while (iterator.hasNext()) {
          if (temp.isEmpty()) {
              firstNumber = iterator.next();
              temp = firstNumber;
              tempValue.put(firstNumber, 1);
          } else {
              String thisStr = iterator.next();
              //后续还有元素
              String tempCompareStr = temp.substring(startIndex,endIndex); //号段尾号 比较位
              //当前号与该号段尾号的步长
              int thisCompareLen = (Integer.parseInt(thisStr.substring(startIndex,endIndex)) - Integer.parseInt(tempCompareStr)) ;
              if (thisCompareLen > 1) {
                  //1. 相邻超过1位,为断号;2. 对连续数据编号;3. 对尾号处理(断号不用处理)
                  Integer value = tempValue.get(firstNumber); //号段首号(key)-该号段已经有多少号了(value)
                  if(value > 1){
                      tempCompareStr = tempCompareStr.substring(tempCompareStr.length() - value.toString().length()); // 号段尾号的拼接位
                      tempValue.put(firstNumber + "-" + tempCompareStr, value);
                      tempValue.remove(firstNumber);
                  }
                  firstNumber = thisStr;
                  temp = thisStr;
                  tempValue.put(firstNumber, 1);
              } else {
                  //步长为1(连续)
                  if(!iterator.hasNext()){
                      //3. 对尾号处理(连续号处理)
                      Integer value = tempValue.get(firstNumber); //号段首号(key)-该号段已经有多少号了(value)
                      tempCompareStr = thisStr.substring(thisStr.length() - value.toString().length()); // 号段尾号的拼接位
                      tempValue.put(firstNumber + "-" + tempCompareStr, ++value);
                      tempValue.remove(firstNumber);
                  }else {
                      // 交换位继续
                      temp = thisStr;
                      Integer value = tempValue.get(firstNumber);
                      tempValue.put(firstNumber, ++value);
                  }
              }
          }
      }
      return tempValue;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值