
本文介绍如何将形如“1 456 2 100 3 600 1 400”的空格分隔字符串,按每对中的**分数(数值)升序排列**,同时保留id与分数的绑定关系,最终输出排序后的字符串(如“2 100 1 400 1 456 3 600”)。
在处理这类“交替出现的键值对”字符串时,直接按字符串或数字ID排序会失效(例如ID重复、且排序目标是分数而非ID),因此核心思路是:结构化解析 → 封装为对象 → 按分数排序 → 序列化回字符串。
首先,定义一个轻量级数据类 Person,用于承载每个ID及其对应分数:
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;
}
}接着,将原始字符串按空格拆分,以步长为2遍历数组,依次提取ID(索引偶数位)和分数(索引奇数位),构建 Person 对象列表:
String input = "1 456 2 100 3 600 1 400";
String[] parts = input.split("\\s+"); // 使用正则 "\\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));
} 然后,使用 List.sort() 配合基于 score 的比较器完成升序排序(支持重复ID,无HashMap键冲突问题):
本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
people.sort(Comparator.comparingInt(p -> p.score));
最后,将排序后的 Person 列表映射为 "id score" 字符串,并用单个空格连接:
String result = people.stream()
.map(Person::toString)
.collect(Collectors.joining(" "));
System.out.println(result); // 输出:2 100 1 400 1 456 3 600✅ 注意事项:
- 输入必须为偶数个非空token,否则解析会越界;建议添加校验(如上示例中的 if (i + 1 >= parts.length));
- 若需降序,可改为 Comparator.comparingInt(p -> p.score).reversed();
- 如需稳定排序(相同分数时保持原始顺序),可使用 Collections.sort(people, Comparator.comparingInt(...))(sort() 方法本身是稳定的);
- 不推荐使用 TreeMap 或 HashMap 直接映射——ID重复会导致数据丢失,违背业务需求。
该方案结构清晰、可读性强、易于扩展(例如后续增加姓名、时间戳等字段),是处理此类成对序列化数据的标准实践。









