【问题标题】:Reading from a text file and creating an array of objects Java从文本文件中读取并创建对象数组 Java
【发布时间】:2015-11-10 14:21:58
【问题描述】:

我有这两个类: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;
}

我想将两个类中的数据转换为String 并将其保存到文本文件中。为此,我编写了以下函数:

public class Contact {

    @Override
    public String toString() {
        StringBuilder str = new StringBuilder();
        int len = numbers.length;

        str.append(name);
        str.append(System.lineSeparator());
        str.append(len);
        str.append(System.lineSeparator());

        for (int i = 0; i < len; i++) {
            str.append(numbers[i]);
            if (i != len - 1)
                str.append(System.lineSeparator());
        }

        return str.toString();
    }
}

public class Phonebook {
    @Override
    public String toString() {
        StringBuilder str = new StringBuilder();

        for (int i = 0, n = contacts.length; i < n; i++) {
            str.append(contacts[i].toString());
            if (i != n - 1) str.append(System.lineSeparator());
        }

        return str.toString();
    }

    public static boolean saveAsTextFile(Phonebook phonebook, String path) {
        boolean saved = true;
        PrintWriter toFile = null;
        try {
            toFile = new PrintWriter(new FileOutputStream(path));
            toFile.println(phonebook.toString());
        }
        catch (FileNotFoundException e) {
            saved = false;
        }
        finally {
            toFile.close();
        }
        return saved;
    }
}

下一步是从现有文本文件中读取内容并重新创建电话簿对象。文本文件格式如下:

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();
        }
    }

还有这个用于创建电话簿(正在进行中):

public static Phonebook loadFromTextFile(String path) throws FileNotFoundException, InvalidFormatException {
    Scanner inputStream = new Scanner(new FileInputStream(path));
    ArrayList<String> contactInfo = new ArrayList<String>();
    int ctr = 0;
    int numContacts;
    String contactString = "";
    Contact contact = null;

    while (inputStream.hasNextLine()) {
        contactInfo.add(inputStream.nextLine());
        if (ctr == 1) {
            numContacts = Integer.parseInt(contactInfo.get(ctr));
            for (int j = 0; j < numContacts; j++) {
                contactInfo.add(inputStream.nextLine());
            }
            System.out.println("contactString inside while loop:");
            contactString = String.join(System.lineSeparator(), contactInfo);
            System.out.println(contactString);
            contact = Contact.valueOf(contactString);
            contactInfo.clear();
            System.out.println("contact inside while loop:");
            System.out.println(contact);
            ctr = 0;
        }
        ctr++;
    }

我遇到的问题是此功能仅适用于文件中的单个联系人。如果有多个,它不起作用。我究竟做错了什么? 我的逻辑是这样的:

  • 从文本文件中读取一行并将其存储在 ArrayList 中

  • 如果您读取联系人数量:

    • 遍历联系人数量,读取每一行并将其存储在 ArrayList 中
  • 完成后,将 ArrayList 的内容转换为 String,将其移动到 contactString 并调用 Contact.valueOf(String s)。当我开始工作时,将生成的联系人存储在 Contact[] 中。

  • 清空 ArrayList 并重新开始。

  • 重复直到 EOF

我无法弄清楚是什么导致了问题。任何帮助表示赞赏。

注意:如果重要,这是家庭作业。

编辑:示例 .txt 文件:

John Doe
3
3124354353
1234324534
5768324242
Alice
1
0547623424
Bob
2
7863257643
3128443552

【问题讨论】:

    标签: java file arraylist


    【解决方案1】:

    问题似乎出在ctr 变量上。
    初始化为0

    int ctr = 0;
    

    在while循环中递增

    ctr++;
    

    在while循环中有一个if语句

    if (ctr == 1) {
    

    里面也设置为0

    所以 while 循环将执行两次,将 2 行添加到 contactInfo,然后将另一行 numOfContacts 添加到 contactInfo,然后尝试创建单个 contact。

    根据示例文本文件的外观,我会推荐这个没有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:");
    }
    

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

    【讨论】:

    • while 循环不会一直执行到文件末尾吗? ctr 不是其条件的一部分
    • 实际上,我总是这样跳过第二个名字。在if 语句之后,ctr 再次为 1,这使得它跳过了numOfContacts 之前的联系人姓名。我应该只把它改成ctr=-1
    • 实际上它可能会循环超出。您没有在 while 循环内的 for 循环中检查 hasNextLine。我相信您使用ctr 的方式只会获得一个联系人。如果您为此发布一个文本文件的示例,那就太好了
    • 保证在实际numContacts之后至少会有numContacts行,因为它的计算方式
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多