
给定一个字符串,其中包含由数字(1到9)后缀的单词。任务是根据这些数字对单词进行重新排列,使它们按照数字的升序出现,最终输出一个仅包含单词并以空格分隔的字符串。
输入示例: "my1kiran4name2is3"
期望输出: "my name is kiran"
解释:
解决此类问题的基本思路可以概括为以下几个步骤:
以下是使用Java 8+ 的Stream API和正则表达式实现上述逻辑的示例代码。为了确保最终输出的顺序正确,我们特意使用了 TreeMap 来存储单词和数字的映射,因为它能自动根据键(即数字)进行排序。
import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class StringReorderer {
public static String reorderStringByNumbers(String inputString) {
// 1. 使用正向后行断言 (?<=\d) 分割字符串
// 这将字符串分割成 "单词+数字" 的片段,例如 "my1", "kiran4", "name2", "is3"
Map<Integer, String> orderedWords = Arrays.asList(inputString.split("(?<=\d)"))
.stream()
// 2. 对每个片段,使用正向前行断言 (?=\d) 再次分割
// 将 "单词+数字" 分割成 ["单词", "数字"] 数组,例如 ["my", "1"]
.map(s -> s.split("(?=\d)"))
// 3. 收集到 TreeMap 中,TreeMap 会根据键(数字)自动排序
// 键是数字 (Integer.parseInt(e[1])),值是单词 (e[0])
.collect(Collectors.toMap(
e -> Integer.parseInt(e[1]), // 键:将数字字符串转换为整数
e -> e[0], // 值:单词字符串
(oldValue, newValue) -> oldValue, // 合并函数,处理重复键(此处通常不发生)
TreeMap::new // 指定使用 TreeMap 来保证键的顺序
));
// 4. 从 TreeMap 中获取所有单词(值),它们已按数字键排序,然后用空格连接
return orderedWords.values()
.stream()
.collect(Collectors.joining(" "));
}
public static void main(String[] args) {
String input = "my1kiran4name2is3";
String output = reorderStringByNumbers(input);
System.out.println("原始字符串: " + input);
System.out.println("重排后字符串: " + output); // 期望输出: my name is kiran
}
}inputString.split("(?<=\d)"):
.map(s -> s.split("(?=\d)")):
.collect(Collectors.toMap(e -> Integer.parseInt(e[1]), e -> e[0], (oldValue, newValue) -> oldValue, TreeMap::new)):
orderedWords.values().stream().collect(Collectors.joining(" ")):
通过本教程,我们学习了如何利用Java的正则表达式(特别是正向后行断言和正向前行断言)和Stream API,结合 TreeMap 的排序特性,高效地解决根据内嵌数字重排字符串中单词的问题。这种方法展示了Java 8+ 强大而富有表现力的编程范式。在实际应用中,选择合适的解决方案时,应综合考虑代码的简洁性、可读性、性能需求以及对输入数据健壮性的要求。
以上就是如何根据内嵌数字重排字符串中的单词的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号