例子:
原字符串:aabbbcccc 结果:a2b3c4
aaabbccd 结果:a3b2c2d
abbddc 结果:ab2d2c
为何不使用HashMap
实现方案,可以使用HashMap<String,Integer>来实现字符串的转换,但HashMap存放元素却是无序且不可重复,所以其字符串顺序却不尽人意,如下代码和结果:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class test03 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("c", 2);
map.put("d", 1);
map.put("a", 4);
map.put("b", 3);
Set<Map.Entry<String, Integer>> entries = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
System.out.println(entry.toString());
}
}
}
结果:
a=4
b=3
c=2
d=1
为何使用LinkedHashMap解决
为解决HashMap无序的特点,可以使用LinkedHashMap来解决,代码和结果如下:
import java.util.*;
public class test03 {
public static void main(String[] args) {
Map<String, Integer> map = new LinkedHashMap<>();
map.put("c", 2);
map.put("d", 1);
map.put("a", 4);
map.put("b", 3);
Set<Map.Entry<String, Integer>> entries = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
while(iterator.hasNext()){
Map.Entry<String, Integer> next = iterator.next();
System.out.println(next.toString());
}
}
}
结果:
c=2
d=1
a=4
b=3
正题——问题解决
如此顺序问题解决,以下代码进入正题,使用LinkedHashMap<String,Integer>来实现原地算法转换字符串:
import java.util.*;
public class test3 {
private static String str = "abbbbbbbbbc";
public static void main(String[] args) {
Map<String,Integer> map = new LinkedHashMap<>();
for (int i = 0; i < str.length(); i++) {
String c = str.charAt(i) + "";
if (map.get(c) == null){
map.put(c,1);
}else {
map.put(c,map.get(c) + 1);
}
}
Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
while (it.hasNext()){
Map.Entry<String, Integer> next = it.next();
System.out.print(next.getKey() + next.getValue());
}
}
}
结果:
a1b9c1
效果实现。