
本文介绍如何将形如“1 456 2 100 3 600 1 400”的空格分隔字符串,按每组第二个值(即分数)升序排序,并保持 id 与对应分数的绑定关系,最终输出重新排列后的字符串。
在处理结构化但未显式建模的字符串数据时,直接按字面量排序(如 String::compareTo)会导致错误结果——例如 ID 和分数混合排序、数值大小被当作字符串比较(如 "100" 先解析语义结构,再基于业务逻辑排序。
本例中,字符串以空格分隔,且严格遵循「ID 分数 ID 分数…」的偶数长度模式。因此,我们应将其解析为若干个 (ID, score) 对,封装为领域对象,再按 score 排序。
✅ 推荐实现:面向对象 + Stream 流式处理
首先定义轻量级数据载体类:
本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
public static class Person {
private final String id;
private final int score;
public Person(String id, int score) {
this.id = id;
this.score = score;
}
// 重写 toString() 便于后续拼接:返回 "id score"
@Override
public String toString() {
return id + " " + score;
}
}接着完成解析、排序与重构三步:
String input = "1 456 2 100 3 600 1 400";
// 1. 解析:按空格切分,两两一组构造 Person 对象
String[] parts = input.split("\\s+");
List people = new ArrayList<>();
for (int i = 0; i < parts.length; i += 2) {
if (i + 1 >= parts.length) {
throw new IllegalArgumentException("Invalid input: odd number of tokens");
}
String id = parts[i];
int score = Integer.parseInt(parts[i + 1]);
people.add(new Person(id, score));
}
// 2. 排序:按 score 升序(Integer.compare 确保安全,避免整数溢出)
people.sort(Comparator.comparingInt(p -> p.score));
// 3. 重构:流式映射为字符串并用空格连接
String result = people.stream()
.map(Person::toString)
.collect(Collectors.joining(" "));
System.out.println(result); // 输出:2 100 1 400 1 456 3 600 ⚠️ 注意事项
- 输入校验:务必检查 parts.length 是否为偶数,防止 ArrayIndexOutOfBoundsException;
- 数字解析异常:Integer.parseInt() 可能抛出 NumberFormatException,生产环境建议包裹 try-catch 或使用 Integer.valueOf(String).orElse(null)(配合 Optional);
- 稳定性:Java 的 List.sort() 是稳定排序,相同分数的记录将保持原始相对顺序(如两个 1 400 和 1 456 均属 ID=1,但因分数不同不涉及此问题;若存在相同分数,该特性可保障可预测性);
- 性能考量:对于超长字符串(如百万级 token),可考虑使用 Arrays.sort() 配合自定义 Person[] 数组以减少泛型开销,但通常 ArrayList + Stream 已足够高效。
该方案清晰分离了解析、排序、序列化关注点,具备良好可读性、可测试性与可扩展性(例如后续增加按 ID 分组聚合、去重、分页等逻辑均易于演进)。









