gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:12:44 25 4
gpt4 key购买 nike

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

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

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[] 中。

  • 清空 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 循环将执行两次,向 contactInfo 添加 2 行,然后向 contactInfo 添加另外 numOfContacts 行,然后尝试创建一个单个联系人

根据示例文本文件的外观,我会推荐这个不带 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,因为它们没有理由存在于外部

关于java - 从文本文件读取并创建对象数组 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33632162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com