题目描述
https://www.cnblogs.com/smile-programmer/p/17322920.html
字符串重新排列
给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出:
1、单词内部调整:对每个单词字母重新按字典序排序
2、单词间顺序调整:
1)统计每个单词出现的次数,并按次数降序排列2)次数相同,按单词长度升序排列
3)次数和单词长度均相同,按字典升序排列请输出处理后的字符串,每个单词以一个空格分隔。
输入描述:
一行字符串,每个字符取值范围:【a-ZA-Z0-9】以及空格,字符串长度范围:【1,1,1000】
例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
题解
public static String processString(String s) {
// step1: 分割为单词
String[] words = s.split("\\s+");
// step2: 按照字典序排序
for (int i = 0; i < words.length; i++) {
char[] charArray = words[i].toCharArray();
Arrays.sort(charArray);
words[i] = new String(charArray);
}
// step3: 统计每个单词的出现次数
HashMap<String, Integer> wordCount = new HashMap<>();
for (String word : words) {
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
// step4: 按照单词出现次数降序、单词长度升序、字典升序排序 单词
ArrayList<Map.Entry<String, Integer>> sortedWords = new ArrayList<>(wordCount.entrySet());
sortedWords.sort((a, b) -> {
// 出现次数降序降序排序
int countCompare = b.getValue().compareTo(a.getValue());
if (countCompare != 0) return countCompare;
// 单词长度升序排序
int lengthCompare = a.getKey().length() - b.getKey().length();
if (lengthCompare != 0) return lengthCompare;
// 字典升序排序
return a.getKey().compareTo(b.getKey());
});
// step5: 构造结果字符串
StringBuilder result = new StringBuilder();
for (Map.Entry<String, Integer> entry : sortedWords) {
String key = entry.getKey();
int count = entry.getValue();
for (int i = 0; i < count; i++) {
result.append(key).append(" ");
}
}
// 移除末尾的空格并返回结果
return result.toString().trim();
}