首先说下字符串的压缩的大概意思:比如一字符串"asdfjsdffffffssddsfsdssss",其中有很多相邻的字符是相同的,那么可以通过一个合并,并记录个数的方式,来进行压缩,从而减少字符串的长度。
实现的方法有很多,下面主要讲解通过Map集合来实现这个功能:
学过java的人都知道,其实字符串的底层是由char数组来维持的,所以我们要先把字符串转换成字符数组。利用Map的键值对的特性,来存储相应的字符和对应的个数。代码如下:
public static String stringCondense(String str) {
Map map = new LinkedHashMap();
char[] charArray = str.toCharArray();
char start = charArray[0];
map.put(start + ":" + 0, 1);
String key = start + ":" + 0 ;
for (int i = 1; i < charArray.length; i++) {
if (charArray[i] == charArray[i - 1]) {
int value = map.get(key);
value++;
map.put(key, value);
} else {
key = charArray[i] + ":" + i;
map.put(charArray[i] + ":" + i, 1);
}
}
String result = "";
for (String s : map.keySet()) {
if (map.get(s) != 1) {
result = result + s.split(":")[0] + map.get(s);
} else {
result = result + s.split(":")[0];
}
}
return result;
}
有几个小注意点:
1.推荐使用LinkedMapHashMap,使用HashMap会有料想不到的收获哦!
2.因为map中key唯一,所有key最好加上当前位置,这样不会覆盖,同时也可以查看原来字符数组的排列顺序。
3.这个代码十分简单,如有不足,请多多包涵!!!