字符串重新排序
知识点 排序 数组
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
给定一个字符串s,s包含以空格分隔的若干个单词,请对s进行如下处理后输出:
1、单词内部调整:对每个单词字母重新按字典序排序;
2、单词间顺序调整:
1)统计每个单词出现的次数,并按次数降序排列;
2)次数相同时,按单词长度升序排列;
3)次数和单词长度均相同时,按字典序升序排列。
请输出处理后的字符串,每个单词以一个空格分隔。
输入描述:
一行字符串,每个字符取值范围:[a-zA-Z0-9]以及空格,字符串长度范围:[1, 1000]
输出描述:
重新排序后的字符串,每个单词间隔1个空格,且首尾无空格
示例1
输入:
This is an apple
输出:
an is This aelpp
示例2
输入:
My sister is in the house not in the yard
输出:
in in eht eht My is not adry ehosu eirsst
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] str = in.nextLine().split(" ");
Map<String, Integer> strMap = new HashMap<>();
for (int i = 0; i < str.length; i++) {
char[] vals = str[i].toCharArray();
//单词内部调整:对每个单词字母重新按字典序排序
Arrays.sort(vals);
String x = String.valueOf(vals);
strMap.put(x,strMap.getOrDefault(x,0)+1);
}
List<Map.Entry<String,Integer>> list = new ArrayList<>(strMap.entrySet());
list.sort(( a, b)->{
if(b.getValue() < a.getValue()){
return -1; //按次数降序
}else if(b.getValue().equals(a.getValue())){ //次数相同
if(b.getKey().length() > a.getKey().length()){
return -1; //按字母长度升序
}else if(b.getKey().length() == a.getKey().length()){ //字母长度相同
return a.getKey().compareTo(b.getKey()); //按字典序升序
}
}
return 1;
});
String res = "";
for(int i=0; i<list.size(); i++){
for(int j=0;j<list.get(i).getValue();j++){
res += list.get(i).getKey() + " ";
}
}
System.out.println(res.substring(0, res.length()-1));
}
}