public class StringSort {
private static String regex = "[a-zA-Z]";
@Test
public void testPatten(){
boolean b = Pattern.matches(regex, "?");
System.out.println(b);
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String str = scanner.nextLine();
if(str == null || str.equals("")){
//return ;
continue;
}
List<String> list = new ArrayList<>();//存放字母的值
//map存放非字母的下标key与非字母的值value.
//这里使用了TreeMap的排序,匿名类实现的方法就是普通的Integer排序,对map的key进行排序(数组下标),
//防止将map中的元素按照key(list的下标)插入时发生IndexOutOfBoundsException
Map<Integer,Character> sortMap = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);//Integer默认的排序就行了
}
});
for (int i=0; i<str.length(); i++){
if ( Pattern.matches(regex, str.charAt(i)+"" ) ){
list.add(str.charAt(i) + "");//字母
}else{
sortMap.put(i,str.charAt(i));//非字母
}
}
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//经过处理之后,list中的字符都为字母
if (o1.equalsIgnoreCase(o2)) {//o1与o2是大小写关系
return 0;//等于
} else if (o1.toLowerCase().toCharArray()[0] > o2.toLowerCase().toCharArray()[0]) {
//全部转化为小写,再将字符串转化为字符数字,由于只包含一个字符,直接取下标为"0"的元素
return 1;//大于
} else{// if (o1.toLowerCase().toCharArray()[0] < o2.toLowerCase().toCharArray()[0]) {
return -1;//小于
}
}
});
sortMap.forEach(
(k,v) -> {
list.add(k.intValue(),v.charValue()+"");
}
);
list.forEach(
n -> System.out.print(n)
);
System.out.println();
}
}
}