Как сохранить различные данные из текстового файла в ArrayLists? - PullRequest
0 голосов
/ 26 апреля 2019

Меня попросили создать телефонную книгу персонала в виде массива, в котором будут храниться их имена и добавочный номер.Телефонная книга должна поддерживать несколько функций:

  1. Добавление новых записей, которые будут вставлены в алфавитном порядке фамилии

  2. Удаление записей по имени илиномер

  3. Имя для поиска с указанным именем

  4. Изменить номер

  5. Печатать всю телефонную книгу

Так что ничего сложного, однако проблема, с которой я сталкиваюсь, связана с текстовым файлом и получением информации, правильно сохраненной в массиве (ах).В текстовом файле содержатся данные, разделенные вкладками в следующем формате:

Фамилия <- TAB -> Инициалы <- TAB -> Расширение

Я полагаю, насколько это назначениеВ заключение, меня просят сначала загрузить данные заполненного текстового файла в массивы программы, которые затем будут обрабатываться с использованием функций, которые я упоминал ранее.Они прямо заявили, что обратная запись в файл здесь не обязательна.

До сих пор я создал несколько классов, которые содержат общую информацию для каждого объекта, который будет использоваться в проекте (т. Е. Класс Entry, интерфейс Directory [требуется], класс ArrayDirectory, класс DirectoryFile).Я пытаюсь прочитать 3 различных элемента из текстового файла, а затем сохранить его в объекте Entry, для которого я создал конструктор.Я знаю, как я буду использовать методы, я просто не могу создать эту начальную ссылку между текстовым файлом и моим массивом, что означает, что я пока не могу прогрессировать вообще.Я пытался реализовать решения, найденные в Интернете, но это оказалось более запутанным.

Так как я сохраняю данные как пользовательский объект (Entry), я также столкнулся с проблемами здесь и в конечном итоге запутался.

Class 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 Class

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.)...

DirectoryFile Class

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 и сообщает index 1 outграниц на длину 1 .Я думаю, что у меня тоже может быть неверная подпись для метода, но это меня больше смущает.Должен ли я передать в метод телефонную книгу ArrayList вместо возврата String?

Извините, это мой первый пост, когда я обращаюсь за помощью в Интернете, поэтому извиняюсь, если я повторился.

1 Ответ

0 голосов
/ 26 апреля 2019

У меня не так много времени, но вот что я сделал для вас ...... измените ваш класс 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, "", ""));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...