之前一道面试题,要求是用“算法”来做,所以我选择了递归而不是循环来做这事儿。
LinkedHashMap解决了顺序问题,剩下的就由一个递归搞定了。
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map.Entry;
import java.util.Scanner;
public class StringAnalysisDemo {
public static void main(String[] args) {
System.out.print("请输入一个字符串:");
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
if(!s.matches("[a-zA-Z]+")){
System.out.print("请输入全字母的字符串:");
}else if(s.matches("[a-zA-Z]+")){
//将字符串解析为List l
char[] chr = s.toCharArray();
LinkedList<Character> l = new LinkedList<Character> ();
for(char c :chr){
l.add(c);
}
LinkedHashMap<Character,Integer> m = new LinkedHashMap<Character, Integer>();
m.put(l.get(0),0);
m = getChar(m,l);
//输出
System.out.println("字符串解析为:");
for (Entry<Character, Integer> entry : m.entrySet()) {
System.out.print(entry.getKey() + " :" + entry.getValue()+" ");
}
System.out.println("。");
}
System.exit(0);
}
/**
* 递归算法取字符串list的每个字符的出现次数,并按出现顺序返回
* @param l:传入list
* @param m:字符出现次数记录的map
* @return l
*/
private static LinkedHashMap<Character,Integer> getChar(LinkedHashMap<Character,Integer> m, LinkedList<Character> l){
if(l.iterator().hasNext()){
if(m.containsKey(l.get(0))){
m.put(l.get(0),m.get(l.get(0))+1);
}else{
m.put(l.get(0),1);
}
l.remove(0);
return getChar(m,l);
}else{
return m;
}
}
}