题解 | #字符串排序#
字符串排序
https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
import java.util.*;
import java.lang.String;
import java.util.ArrayList;
import java.util.Arrays;
import java.lang.*;
import java.util.HashSet;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
String s = in.nextLine();
HashSet<String> hs0 = new HashSet<>();//存放字母字符用于排序
ArrayList<Integer> ho=new ArrayList<>();//存放输入串中非字母字符的下标值
for(int i=0;i<s.length();i++ ){
String si = Character.toString(s.charAt(i));
if(!si.matches("[a-zA-Z]")){
ho.add(i);
}else{
hs0.add(si.toUpperCase());//统一转换成大写字母存入
}
}
Object[] hso=hs0.stream().sorted().toArray();//对输入串中出现过的字母字符进行排序
//构造字符串,将输入串中的字母字符重新排序
StringBuilder sb = new StringBuilder();
for(int k=0;k<hso.length;k++){
char[] sa=s.toCharArray();
String sok=(String)hso[k];
//通过循环,每次取一个字母,将输入串中包含该字母(无论大小写)的字符放入构造的字符串
for(int v=0;v<sa.length;v++){
String sav=Character.toString(sa[v]);
if(sav.equals(sok)||sav.equals(sok.toLowerCase())){
sb.append(sav);
}
}
}
//将非字母字符按照原来的位置插入已构造的字符串中
for(int n=0;n<ho.size();n++){
int ind=ho.get(n);
sb.insert(ind,s.charAt(ind));
}
System.out.println(sb.toString());
}
}
}

