
本文详解如何将形如“john.davidson/belgrade michael.barton/krakow”的空格分隔字符串,按空格→点/斜杠替换→拆分→构造对象→存入数组的流程,自动化生成 person 对象数组并规范输出。
本文详解如何将形如“john.davidson/belgrade michael.barton/krakow”的空格分隔字符串,按空格→点/斜杠替换→拆分→构造对象→存入数组的流程,自动化生成 person 对象数组并规范输出。
要实现从原始字符串到结构化对象数组的完整转换,关键在于分步解耦、避免硬编码、确保对象可读性。原代码存在三个核心问题:
-
错误的正则分割:
split("[/. ]")将整个字符串打散为["John","Davidson","Belgrade","Michael",...],丢失了姓名与城市的逻辑分组; -
手动构造对象且数量写死:
new Person[3]和硬编码索引违背可扩展性原则; -
未重写
toString():导致打印Person@xxxxxx(默认哈希码),而非期望的"John Davidson Belgrade"。
✅ 正确做法是:先按空格切分整体记录 → 再对每条记录分别处理姓名与城市 → 构造对象 → 收集为数组。以下是优化后的完整实现:
import java.util.*;
import java.util.stream.Collectors;
public class Program {
public static void main(String[] args) {
String text = "John.Davidson/Belgrade Michael.Barton/Krakow Ivan.Perkinson/Moscow";
// Step 1: 按空格分割,得到每条完整记录(如 "John.Davidson/Belgrade")
String[] records = text.split(" ");
// Step 2: 将每条记录映射为 Person 对象
Person[] persons = Arrays.stream(records)
.map(record -> {
// 替换 '.' 和 '/' 为空格,再按空格二次分割
String[] parts = record.replaceAll("[./]", " ").split("\s+", 3);
// parts[0]=名, parts[1]=姓, parts[2]=城市(确保至少3部分,避免越界)
return new Person(
parts.length > 0 ? parts[0] : "",
parts.length > 1 ? parts[1] : "",
parts.length > 2 ? parts[2] : ""
);
})
.toArray(Person[]::new);
// Step 3: 输出(需确保 Person.toString() 返回期望格式)
for (Person p : persons) {
System.out.println(p);
}
}
}
class Person {
private final String name;
private final String surname;
private final String city;
public Person(String name, String surname, String city) {
this.name = name;
this.surname = surname;
this.city = city;
}
// ✅ 关键:重写 toString(),返回 "Name Surname City" 格式
@Override
public String toString() {
return name + " " + surname + " " + city;
}
}运行输出:
John Davidson Belgrade Michael Barton Krakow Ivan Perkinson Moscow
? 注意事项与最佳实践:
- 使用
replaceAll("[./]", " ")统一替换分隔符,再用split("\s+", 3)限制最多分割为3部分(防多余空格干扰); -
Person字段建议设为private final,增强不可变性与线程安全性; - 若输入格式可能异常(如缺失字段),应在
map中添加校验逻辑或抛出IllegalArgumentException; - 如需支持更多城市名含空格(如
"New York"),应改用正则匹配(如(.*)\.(.*)/(.*))而非简单替换+分割。
该方案完全自动化、可扩展、健壮性强,无需预知记录数量,也彻底规避了原始代码中的硬编码和显示异常问题。

















