花了一两个小时才做出来,整体思路如下:
- 先用map把预定的键值对存起来, 将键单独存在keys里面
- 判断是数字,就不变; 是大写字母,就转小写再+1(ASCII码表); 是Z就变a;
- 最后, 遍历keys集合, 判断每一个key是否包含当前的字符, 包含的话就get(key) 得到map中存好的对应值, 并把这个值赋给当前字符的引用.
- 遍历输出字符数组中的元素就好了,用print不换行.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, Character> map = new HashMap<>();
map.put("abc",'2');
map.put("def",'3');
map.put("ghi",'4');
map.put("jkl",'5');
map.put("mno",'6');
map.put("pqrs",'7');
map.put("tuv",'8');
map.put("wxyz",'9');
Set<String> keys = map.keySet();
//Map用来存键值对, set存的是键
while(sc.hasNext()){
String pd = sc.nextLine();
char[] cs = pd.toCharArray(); //转成char数组便于修改值
for(int i = 0; i<cs.length; i++){ //遍历char数组
if(cs[i] >= '0' && cs[i] <= '9'){
cs[i] = cs[i]; //如果是正整数, 值不变
}else if (cs[i]>='A' && cs[i]<='Y'){ //ASCII常识
cs[i] = (char)(cs[i]+32+1); //如果是大写字母,+32转小写,+1到下一个字母
}else if(cs[i]=='Z'){ //如果是Z,变成a就行了
cs[i] ='a';
}else{ //else判断的都是小写字母了
for(String e: keys){ //遍历set, 每个e都是一个键
if (e.contains(String.valueOf(cs[i]))){
cs[i] = map.get(e); //如果e中包含该小写字母
} //将该字母换成e对应的值
}
}
}
for(char ele: cs){System.out.print(ele);} //遍历输出cs数组元素
}
}
}