gpt4 book ai didi

java - 如何将文本文件中的不同数据存储到ArrayList中?

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

我被要求以数组的形式创建一个员工电话簿,其中包含他们的姓名和分机号码。电话簿支持以下几个功能:

  1. 添加将按姓氏字母顺序插入的新条目

  2. 按姓名或号码删除条目

  3. 查找名字给定的名字

  4. 更改号码

  5. 打印整个电话簿

所以没有什么进展,但是我遇到的问题在于文本文件以及将信息正确存储在数组中。该文本文件包含由制表符分隔的数据,格式如下:

姓氏<--TAB-->姓名缩写<--TAB-->扩展名

我相信从作业的措辞来看,我被要求首先将填充的文本文件数据加载到程序中的数组中,然后使用我之前提到的函数对其进行操作。他们明确表示这里不需要写回文件。

到目前为止,我已经创建了几个类,其中包含将在项目中使用的每个对象的一般信息(即 Entry 类、Directory 接口(interface) [必需]、ArrayDirectory 类、DirectoryFile 类)。我试图从文本文件中读取 3 个不同的项目,然后将其存储在我为其创建构造函数的 Entry 对象中。我知道如何使用这些方法,我只是无法在文本文件和数组之间创建这个初始链接,这意味着我根本无法取得进展。我尝试过实现网上找到的解决方案,但事实证明这更令人困惑。

由于我将数据保存为自定义对象(条目),我在这里也遇到了问题,并且最终感到非常困惑。

入门级

public class Entry {

private String firstName = null;
private String surname = null;
private String extension = null;

public Entry(String firstName, String surname, String extension) {
super();
this.firstName = firstName;
this.surname = surname;
this.extension = extension;
}

...(getters and setters, toString)...

ArrayDirectory类

public class ArrayDirectory implements Directory {

private final static int MAX_ENTRIES = 20;
private static Scanner input = new Scanner(System.in);
DirectoryFile file = new DirectoryFile("C:\\Users\\John\\Documents\\Phonebook.txt");
static List<Entry> phonebook = new ArrayList<>(MAX_ENTRIES);

public void addEntry() throws IOException {
// check if phone book is empty before loading entries
System.out.println(phonebook.isEmpty());
loadEntries(file.getFile());
System.out.println("Enter first name: ");
String fname = input.nextLine();
System.out.println("Enter second name: ");
String sname = input.nextLine();
System.out.println("Enter telephone extension: ");
String telephone = input.nextLine();

Entry entry = new Entry(fname, sname, telephone);
phonebook.add(entry);
System.out.println("Added staff member: \n" + fname + "\n" + sname + "\n" + telephone);
System.out.println(Arrays.toString(phonebook.toArray()));

}

public String loadEntries(File file) throws IOException {
String surname = null, fname = null, extension = null;
BufferedReader br = new BufferedReader(new FileReader(file));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();

while (line != null) {
String arr[] = line.split("\\s+");
surname = arr[0];
fname = arr[1];
extension = arr[2];
Entry entry = new Entry(surname, fname, extension);
phonebook.add(entry);
line = br.readLine();

}
} finally {
br.close();
}
return null;
}

...(other methods for functionality, testing etc.)...

目录文件类

public class DirectoryFile {

private File file;

public DirectoryFile(String fileName) {
this.file = new File(fileName);
}

public DirectoryFile(File file) {
this.file = file;
}

public File getFile() {
return file;
}

我遇到的问题是,当运行 loadEntries() 方法时,它会给出 OutOfBoundsException 并指出索引 1 超出长度 1 的范围。我想我的方法的返回签名也可能不正确,但这让我更加困惑。我应该将电话簿 ArrayList 传递到方法中而不是返回 String 吗?

抱歉,这是我第一篇在线寻求帮助的帖子,因此如果我重复了自己的话,我深表歉意。

最佳答案

我现在没有太多时间,但这就是我为你做的......修改您的 Entry 类以实现 Comparable 并重写 equals(),如下所示:

public class Entry implements Comparable {

private String firstName = null;
private String surname = null;
private String extension = null;

public Entry(String firstName, String surname, String extension) {
this.firstName = firstName;
this.surname = surname;
this.extension = extension;
}

@Override
public int compareTo(Object arg0) {//important for sorting
this.surname.compareTo(((Entry) arg0).surname);
return 0;
}

@Override
public boolean equals(Object arg0) {//important for deleting
return ((Entry) arg0).firstName.equalsIgnoreCase(this.firstName);
}
}

以下是其他附加方法:


public void writetofile(List<Entry> entry) throws Exception {
File f = new File("path");
try (Writer w = new FileWriter(f); PrintWriter pw = new PrintWriter(w);) {
for (Entry e : entry) {
String line = e.surname + "--------" + e.firstName + "--------" + e.extension;
pw.println(line);
}
} catch (Exception e) {
throw e;
}
}

public List<Entry> sortbysurname(List<Entry> entry) {
Collections.sort(entry);
return entry;
}

// returns the index of the entry
public boolean deleteByName(String name, List<Entry> entry) {
return entry.remove(new Entry(name, "", ""));
}

关于java - 如何将文本文件中的不同数据存储到ArrayList中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55870019/

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