- 使用list集合来收集字符集合,并且设置排序规则,写入的数据全部都变成小写排序,这样就不会破坏字符是否大写的顺序了
- 使用list来装入的是目标字符串的每个字符的排序,但是还有非字符没有写入,此时声明一个StringBuffer对象来收集集合
- 遍历目标集合,做如下判断:
(1)如果是字母,那么就从list集合中读取出来一个字符,写入到StringBuffer对象中,集合遍历下标+1
(2)如果是非字母,那么就说明是其他的特殊字符,那么就直接写入StringBuffer对象,这样就不会破坏原来字符串的位置了。
例如: bBeTy?u;
此时:排序后的list集合中的数据为 : b B e T u y
使用局部变量j = 0;开始读取list集合,i = 0;开始读取原来字符串s
step1:i = 0; s.charAt(0) 此时为'b',是字母,那就从list读取写入结果串,并且j++,i++
step2:i= 1,j = 1,'B'也是字母依次类推
。。。
当i = 5时候,读取到了原来字符串的字符'?',此时判断为非字母,就直接将'?'直接写入结果集合,并且j不改变。
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class Main{
public static void sortString(String s){
List<Character> list = new ArrayList<>();// 将字符串s按照空格分隔然后写入list集合
StringBuffer res = new StringBuffer();
for(int i = 0; i < s.length();i++){
if(Character.isLetter(s.charAt(i)))
list.add(s.charAt(i));
}
// 书写排序规则
list.sort(new Comparator<Character>() {
@Override
public int compare(Character o1, Character o2) {
return Character.toLowerCase(o1) - Character.toLowerCase(o2);// 根据小写来判断的话,不会破坏字符串输入的前后规则
}
});
// 遍历原来的字符串,形成结果
for(int i = 0,j = 0; i < s.length();i++){
// 如果不是字符,那么就直接保存当前的位置
if(Character.isLetter(s.charAt(i)))
res.append(list.get(j++));// 如果是字符,那么就将list集合的字符添加进去,否则就添加s字符串的非字符数据
else res.append(s.charAt(i));
}
System.out.println(res);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String target = new String(sc.nextLine());
sortString(target);
}
}
}