连续字符串编号处理工具,拼接与计数
/**
* 排序工具类(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;
}