Java 如何解析字符串并向构造函数发送多个值
我在做一个类赋值,我必须将给定的字符串解析成不同类型的变量。不同的变量是:姓名、姓氏、出生日期、出生城市。完成此操作后,需要将变量发送到类Person的构造函数 我一直在研究如何将三个不同的值赋给一个变量,然后将其发送回构造函数。我曾尝试为每个变量声明一个数组,然后用值填充for循环,但后来我发现很难找到一种简洁的方法来声明其长度,而且我认为我需要将数组转换回字符串,以便将值传递给构造函数,结果代码会很混乱。有没有更简单的方法 我不知道这是否会改变代码中的任何内容,但在我将值传递给构造函数之后,我需要将该对象发送到列表集合,并使用它打印每个人的详细信息 这是我目前的代码:Java 如何解析字符串并向构造函数发送多个值,java,arrays,parsing,constructor,Java,Arrays,Parsing,Constructor,我在做一个类赋值,我必须将给定的字符串解析成不同类型的变量。不同的变量是:姓名、姓氏、出生日期、出生城市。完成此操作后,需要将变量发送到类Person的构造函数 我一直在研究如何将三个不同的值赋给一个变量,然后将其发送回构造函数。我曾尝试为每个变量声明一个数组,然后用值填充for循环,但后来我发现很难找到一种简洁的方法来声明其长度,而且我认为我需要将数组转换回字符串,以便将值传递给构造函数,结果代码会很混乱。有没有更简单的方法 我不知道这是否会改变代码中的任何内容,但在我将值传递给构造函数之后,
public static void main(String[] args) {
// Given string to parse
String text = "John.Davidson/05051988/Belgrade Michael.Barton/01011968/Krakov Ivan.Perkinson/23051986/Moscow";
String[] parsArray = text.split("[ /.]+");
// Results from parsing
for (Object s: parsArray)
{
System.out.println(s);
}
for (int i = 0; i<parsArray.length; i+=4)
{
String firstName = parsArray[i];
String lastName = parsArray[i+1];
String birthPlace = parsArray[i+3];
System.out.println("\nFirst name: " + firstName + "\nLast name: " + lastName + "\nCity of birth: " + birthPlace);
}
}
}
使用
ArrayList
存储Person
对象
DateTimeFormatter dobFormatter = DateTimeFormatter.ofPattern("ddMMuuuu");
ArrayList<Person> list = new ArrayList <Person> ();
for (int i = 0; i<parsArray.length; i+=4)
{
String firstName = parsArray[i];
String lastName = parsArray[i+1];
LocalDate dob = LocalDate.parse(parsArray[i+2], dobFormatter);
String birthPlace = parsArray[i+3];
System.out.println("\nFirst name: " + firstName + "\nLast name: " + lastName + "\nCity of birth: " + birthPlace);
list.add (new Person (firstName, lastname, dob, birthPlace));
}
DateTimeFormatter dobFormatter=DateTimeFormatter.of模式(“DDMMUUU”);
ArrayList=新的ArrayList();
对于(int i=0;i你的思路是对的,但我认为如果你能以一种帮助你隔离问题的方式来构造代码,你会取得一些额外的进展。目标是将问题分解成足够小的部分,以便用简单、内聚的函数来处理。我喜欢在尝试填充类或方法的细节之前先勾画出它们的草图。But首先,我从讨论问题开始
目标是将一行文本转换为特定于类型的Person对象的集合。输入使用单个空格作为记录分隔符,“.”句点将名字与姓氏分开,并使用“/”斜杠将记录中的其他字段分开。啊……经典
第一步是仅仅隔离处理每个单独记录的文本块。我可以看到这一点,因为我注意到输入文本的第一件事是它使用空格分隔关于不同人的信息。不需要尝试编写代码试图一口吞下鲸鱼,对吗
String[] parseRecords(String input) {
return input.split("[ ]+");
}
既然记录彼此隔离,我们需要一种方法来从只包含单个记录的文本块生成Person记录,即原始输入的子集,它只包含单个人的信息。在我的问题描述中,我注意到“.”和“/”都用作字段分隔符,因此我们可以分开有很多其他的方法来编写这个正则表达式,但是我复制了你在问题中使用的方法
Person parsePersonFromString(String text) {
String[] fields = text.split("[./]+");
LocalDate dob = /* something with field[2] */
return new Person(fields[0], fields[1], dob, fields[3]);
}
请注意,字符串的拆分数组的长度应为4。前两个字段是名称,因此它们已经是字符串类型。城市字段也是如此。日期字段变得有点棘手,因为您有一个字符串,并且您需要一个LocalDate。由于这是家庭作业,我将把详细信息留给您,但请记住,如果您也遇到了麻烦,请记住你可以把它分解成一个更简单的问题
LocalDate parseDateFromField(String field) {
}
“我一直在研究如何将三个不同的值分配给一个变量”真的吗?你的代码就是这样做的,例如String firstName=parsrarray[I]
。你刚刚给一个局部变量赋值。@Andreas谢谢,我没有注意到存在dob
。@ScaryWombat谢谢你发布了你的解决方案,效果非常好。在看到这个答案之前,我完成了DateTimeFormatter部分,但仍然很有帮助!我只是介绍了ArrayList的基本内容,但这就是你解决的问题我喜欢阅读你的详尽解释,你说得很对,“不必试图编写代码试图一口吞下鲸鱼”。这是我一直试图做的事情,但往往会迷失方向,所以我会接受你对未来的好建议。干杯!
LocalDate parseDateFromField(String field) {
}