从文本文件读取并创建Java对象数组

从文本文件读取并创建Java对象数组,java,file,arraylist,Java,File,Arraylist,我有两类:Contact和Phonebook: public class Contact implements Comparable<Contact> { private String name; String[] numbers; private final int NUMBER_LIMIT = 5; } public class Phonebook { private final int CONTACT_LIMIT = 250; Cont

我有两类:
Contact
Phonebook

public class Contact implements Comparable<Contact> {
    private String name;
    String[] numbers;
    private final int NUMBER_LIMIT = 5;
}

public class Phonebook {
    private final int CONTACT_LIMIT = 250;
    Contact[] contacts;
}
下一步是从现有文本文件中读取内容并重新创建电话簿对象。文本文件的格式如下:

Contact name (String)
Number of phone numbers (int)
Phonenumber(s) (String)
文本文件中可以有多个联系人。 到目前为止,我有一个从字符串创建联系人的函数:

public static Contact valueOf(String s) throws InvalidFormatException {
        String lineSeparator = System.lineSeparator();
        String[] chunks = s.split(lineSeparator);
        int len = chunks.length;

        if (len < 2) throw new InvalidFormatException();

        //System.out.println(Arrays.toString(chunks));
        String name = chunks[0];
        String[] numbers = new String[Integer.parseInt(chunks[1])];
        for (int i = 2; i < len; i++)
            numbers[i - 2] = chunks[i];

        Contact contact = null;

        try {
            contact = new Contact(name, numbers);
            return contact;
        }
        catch (Exception e) {
            throw new InvalidFormatException();
        }
    }

问题似乎是
ctr
变量。
它被初始化为
0

int ctr = 0;
在while循环中递增

ctr++;
if (ctr == 1) {
while循环中有一个if语句

ctr++;
if (ctr == 1) {
在中,也设置为
0

int ctr = 0;
因此while循环将执行两次,在
contactInfo
中添加两行,然后在
contactInfo
中添加另一行
numofactors
行,然后尝试创建一个
联系人

根据示例文本文件的外观,我建议使用不带
ctr
变量的更简单版本

while (inputStream.hasNextLine()) {
    contactInfo.add(inputStream.nextLine());
    int numContacts = Integer.parseInt(inputStream.nextLine());

    for (int j = 0; j < numContacts; j++) {
        contactInfo.add(inputStream.nextLine());
    }
    System.out.println("contactString inside while loop:");
    String contactString = String.join(System.lineSeparator(), contactInfo);
    System.out.println(contactString);

    contactInfo.clear();
    System.out.println("contact inside while loop:");
}
while(inputStream.hasNextLine()){
contactInfo.add(inputStream.nextLine());
int numContacts=Integer.parseInt(inputStream.nextLine());
对于(int j=0;j

请注意,我在循环中定义了
contactString
numContacts
,因为它们没有理由存在于外部

while
循环不会执行到文件结束吗?ctr不是其条件的一部分事实上,我总是以这种方式跳过第二个名称。在
if
语句之后,
ctr
再次为1,这使得它跳过
numOfContacts
之前的联系人姓名。我应该只把它改成
ctr=-1
,实际上它可能会循环超过。您没有在while循环内的for循环中检查
hasNextLine
。我相信你使用ctr的方式只能得到一次联系。如果您发布一个文本文件的示例,那就太好了,因为它的计算方式,可以保证在实际的
numContacts
之后至少有
numContacts