压缩或者解压缩字符串 aaaaddcccmmm-> 4a2d3c3m * 3c4f3d-> cccffffddd

6 阅读1分钟
/**
 * 压缩或者解压缩字符串 aaaaddcccmmm-> 4a2d3c3m
 *                    3c4f3d-> cccffffddd
 * @return
 */
public static String zipOrUnZipStr(String srcStr){
    if (srcStr==null || srcStr.isEmpty()){
        return "!error";
    }
    if (srcStr.length()>100){
        return "!error";
    }
    for (int i = 0; i < srcStr.length(); i++) {
        char charTemp = srcStr.charAt(i);
        if (Character.isUpperCase(charTemp)){
            return "!error";
        }
        if (!(charTemp>='a' && charTemp <= 'z' || charTemp > '2')){
            return "!error";
        }
    }
    HashMap<Character, Integer> characterCntMap = new HashMap<>();
    StringBuilder stringBuilder = new StringBuilder();
    StringBuilder stringBuilder1 = new StringBuilder();
    //mm3c4f3daa-> mmcccffffdddaa
    for (int i = 0; i < srcStr.length(); i++) {
        char charTemp = srcStr.charAt(i);
        if (Character.isDigit(charTemp) && charTemp > '2'){
            char charAt = srcStr.charAt(i + 1);
            int intCnt = Integer.parseInt(String.valueOf(charTemp));
            for (int j = 0; j < intCnt; j++) {
                stringBuilder.append(charAt);
            }
        }else{
            if (i>0){
                char charAt = srcStr.charAt(i - 1);
                if (!(Character.isDigit(charAt) && charAt > '2')){
                    stringBuilder.append(charTemp);
                }
            }else {
                stringBuilder.append(charTemp);
            }
            if (characterCntMap.containsKey(charTemp)){
                characterCntMap.put(charTemp,characterCntMap.get(charTemp)+1);
            }else {
                characterCntMap.put(charTemp,1);
            }
        }
    }
    //mmmmmmmmmaaccddddfff {a=2, c=2, d=3, f=3, m=9}
    //aaaaddcaccmmm-> 4a2d3c3m
    LinkedHashSet<Character> linkedHashSet = new LinkedHashSet<>();
    for (int j = 0; j < srcStr.length(); j++) {
        char charAt = srcStr.charAt(j);
        linkedHashSet.add(charAt);
    }
    for (Character e : linkedHashSet) {
        Integer integerCnt = characterCntMap.get(e);
        if (integerCnt!=null){
            if (integerCnt>2){
                stringBuilder1.append(integerCnt);
                stringBuilder1.append(e);
            }else {
                for (int i = 0; i < integerCnt; i++) {
                    stringBuilder1.append(e);
                }
            }
        }
    }
    for (int i = 0; i < srcStr.length(); i++) {
        char charAt = srcStr.charAt(i);
        if (Character.isDigit(charAt) && charAt > '2'){
            String retUnZipStr = stringBuilder.toString();
            if (retUnZipStr.length()>100){
                return "!error";
            }else {
                return retUnZipStr;
            }
        }
    }
    return stringBuilder1.toString();
}