
package test03;
import java.util.ArrayList;
import java.util.List;
public class Demo {
// 实现压缩字符串 例如AABB -> A2B2 AAABBBC ->A3B3C1
public static void main(String[] args) {
// 例如:先存入一个字符串
String strl = "AABBB";
int length = strl.length();
// 先存入集合里 因为集合可以把每个字符的下标都能遍历出来
List<Integer> list = new ArrayList();
// 添加字母下标
for (int i = 0; i < strl.length() - 1; i++) {
if (strl.charAt(i) != strl.charAt(i + 1)) {
list.add(i);
}
}
// 举例例如: ABC 我上面的方法不能添加到最后一位 只能输出A1B1 C1就不能输出
// 因为最后一位没有可以比较的 所以不满足if条件也就没有添加下标
// 这里我就进行了处理
// 当最后一位没有比的话我就默认把最后一位的下标也添加进入
if (strl.charAt(strl.length() - 1) != strl.charAt(strl.length() - 2)) {
list.add(strl.length() - 1);
// 结束 是弄BB得这一段
// 但还有情况 就是当倒数第二个和倒数第一个如果相同,那他也不会执行
// 例如 AABB 他就只会执行 A2 而B2不会执行
// 所以再加个判断
} else {
list.add(strl.length() - 1);
}
// 再把AABB变为 A2B2 首先就要把开始的下标和结束下标找出 例如A-start=0 A-end
// 返回字符串可以用subString方法 subString方法 下标 数字
// 举例: AABB
// 上面存入的字母的下标 list集合里的
// list={1,3};
// 开始(start) 结束(end)
// A 0 2
// B 2 4
// start = (1-1) 前面的1 对应的i的下标是0
// list.get(i-1)-1
// start = [(list.get(1-1))-1]
// AAABBB list = {2,5};
// A 0 3
// B 3 6
// 找规律:
// 开始 = 首次进入 为默认值0 而第二次进入 却发生了改变
// 其实接下去也会发生改变 这里的例子我不再这里写出 可以自己试试(我已经验证过了)
// 说明开始进入的第一次也就是i=0的时 要用默认值说明start没有被赋值
// 但接下去的start却又被赋值 可以用if判断 if!=0 满足的才赋值
//AABB A+2 B+2 A: 2-0 b: 4-2
int start = 0;
int end = 0;
StringBuffer sbf = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
//AABB中AA的end 跟BB的end
end = list.get(i) + 1;
if (i != 0) {
//AABB中AA的start BB的start
start = list.get(i - 1) + i;
}
//这步就相当于把AABB中的 AA 提取出来 BB也提取出来
String s = strl.substring(start, end);
sbf.append(s.charAt(0)).append(end-start);
}
// 用charAt(0)方法把 第一个字母都提取出来 变为A+2+B+2 就可以用StringBuffer
// 的append追加
System.out.println(sbf);
}
}
