
本文介绍如何将形如“1 456 2 100 3 600 1 400”的空格分隔字符串,按每对中的**分数值(而非id)升序重排**,并保持id与对应分数绑定,最终输出格式一致的字符串。
在处理结构化但未显式建模的字符串数据时(如交替出现的 ID 和分数),直接使用 HashMap 会因 ID 重复而丢失数据(例如两个 1 对应不同分数),因此必须采用可容纳重复键的有序集合结构。最佳实践是:先解析为自定义对象列表,再按分数排序,最后序列化回字符串。
✅ 推荐实现步骤
-
定义轻量实体类,封装 ID(String 类型,保留前导零等可能性)和分数(int):
public static class Person { private final String id; private final int score; public Person(String id, int score) { this.id = id; this.score = score; } @Override public String toString() { return id + " " + score; // 严格匹配原始格式:无逗号、空格分隔 } } -
解析字符串为 Person 列表:以空格切分后,每两个元素组成一对(ID + 分数):
String input = "1 456 2 100 3 600 1 400"; String[] parts = input.split("\\s+"); // 使用 \\s+ 更鲁棒(兼容多空格/制表符)
List
3. **按分数升序排序**(稳定排序,相同分数时保持原顺序): ```java people.sort(Comparator.comparingInt(p -> p.score));
-
拼接为最终字符串(用单个空格连接所有 Person.toString()):
String result = people.stream() .map(Person::toString) .collect(Collectors.joining(" ")); System.out.println(result); // 输出:2 100 1 400 1 456 3 600
⚠️ 注意事项
- 输入校验:确保 parts.length 为偶数,否则抛出异常提示格式错误;
- 分数解析异常:Integer.parseInt() 可能抛 NumberFormatException,生产环境建议包裹 try-catch 并提供默认值或日志;
- 性能考虑:若数据量极大(如百万级对),可改用 Arrays.sort() 配合原始数组避免对象开销,但可读性下降;
- 扩展性:如需支持降序,仅需将 Comparator.comparingInt(...) 替换为 Comparator.comparingInt(...).reversed()。
该方案清晰分离了解析、排序、序列化三阶段,逻辑内聚、易于测试与维护,是处理此类“隐式键值对字符串”排序问题的标准范式。










