簡體   English   中英

從文本文件讀取並創建對象數組Java

[英]Reading from a text file and creating an array of objects Java

我有這兩類: ContactPhonebook

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

下一步是從現有文本文件中讀取內容,然后重新創建Phonebook對象。 文本文件具有以下格式:

Contact name (String)
Number of phone numbers (int)
Phonenumber(s) (String)

文本文件中可以有1個以上的聯系人。 到目前為止,我已經具有用於從字符串創建聯系人的功能:

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存儲在Contact []中。

  • 清空ArrayList並重新開始。

  • 重復直到EOF

我不知道是什么原因引起的。 任何幫助表示贊賞。

注意:如果有關系,這是一項家庭作業。

編輯:樣本.txt文件:

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

問題似乎是ctr變量。
初始化為0

int ctr = 0;

在while循環中增加

ctr++;

而while循環中有一個if語句

if (ctr == 1) {

在里面也設置為0

因此,while循環將執行兩次,加入2線contactInfo再加入另一numOfContactscontactInfo ,然后嘗試創建一個單一的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:");
}

請注意,我在循環中定義了contactStringnumContacts ,因為沒有理由使它們不存在於外部

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM