Как найти ArrayList для определенного атрибута пользовательского объекта, чтобы затем удалить - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть программа телефонной книги, которая заполняет ArrayList объектами Entry данными из текстового файла.

Данные загружаются в ArrayList, когда они создаются с помощью конструктора, а затем сортируются в алфавитном порядке по фамилии. Что мне нужно сделать, это ввести имя или добавочный номер телефона , который затем удалит эту конкретную запись из телефонной книги. Мне также нужно иметь возможность искать добавочный номер , вводя имя.

До сих пор я пытался поработать с методом equals и создал метод deleteByName в своем классе Entry, однако это приводит к большому количеству ошибок при запуске программы (ConcurrentModificationException в нескольких разных строках)

public class Entry implements Comparable<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;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getSurname() {
        return surname;
    }

    public String getExtension() {
        return extension;
    }

    @Override
    public String toString() {
        return "\nFirst Name: " + getFirstName() + "\nSurname: " + getSurname() + "\nExtension: " + getExtension();
    }

    @Override
    public int compareTo(Entry e) {
        return surname.compareTo(e.getSurname());
    }

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

}

У меня есть класс с именем ArrayDirectory, в котором есть ArrayList и все методы работы.

public class ArrayDirectory implements Directory {

    // Instantiate variables for program
    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");
    private ArrayList<Entry> phonebook = new ArrayList<>(MAX_ENTRIES);

    public ArrayDirectory() throws IOException {
        loadEntries(file.getFile());
        runMenu();
    }

    public void runMenu() {
        Scanner sc = new Scanner(System.in);
        int choice;
        do {
            System.out.println("\nStaff Phonebook Program");
            System.out.println("Select an option: (1-6)");
            System.out.println("1) Add new record");
            System.out.println("2) Delete record");
            System.out.println("3) Search for record");
            System.out.println("4) Change a number");
            System.out.println("5) Display all records");
            System.out.println("6) Exit program");

            choice = sc.nextInt();

            switch (choice) {
            case 1:
                System.out.println("\nEnter first name: ");
                String fname = input.nextLine();
                System.out.println("Enter surname: ");
                String sname = input.nextLine();
                System.out.println("Enter telephone extension: ");
                String telephone = input.nextLine();
                addEntry(fname, sname, telephone);
                break;
            case 2:
                printDirectory();
                System.out.println("Enter name or number: ");
                String nameOrNum = input.nextLine();
                System.out.println("Removed staff member: " + deleteByName(nameOrNum, phonebook));

                break;
            case 3:

                break;
            case 4:

                break;
            case 5:
                printDirectory();
                break;
            case 6:
                System.out.println("Program closed");
                break;
            default:

                break;
            }
        } while (choice != 6);
    }

    // This method will allow the user to add a new entry to the phone book. The
    // phone book will be
    // alphabetically sorted.
    public void addEntry(String firstName, String surname, String extension) {
        Entry entry = new Entry(firstName, surname, extension);
        phonebook.add(entry);
        System.out.println("\nAdded staff member: " + firstName + "\t" + surname + "\t" + extension);

    } // End of addEntry()

    public ArrayList<Entry> loadEntries(File file) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(file));
        try {
            String line = br.readLine();

            while (line != null) {
                String arr[] = line.split("\\s");
                // Entry(firstName, surname, extension)
                Entry entry = new Entry(arr[0], arr[1], arr[2]);
                phonebook.add(entry);
                line = br.readLine();
                if (line.isEmpty()) {
                    break;
                }

            }
        } finally {
            br.close();
        }
        sortBySurname(phonebook);
        return phonebook;
    } // End of loadEntries()

    // This method will allow the user to delete a specific entry
    // From the directory either by name or number
    public void deleteEntry(String fullName, String phoneNumber) {
        // TODO
    }

    public void printDirectory() {
        System.out.println("Surname \tFirst Name \tExtension Number");
        for (Entry e : phonebook) {
            System.out.println(e.getFirstName() + "\t" + e.getSurname() + "\t" + e.getExtension());
        }
    }

    public ArrayList<Entry> sortBySurname(ArrayList<Entry> entries) {
        Collections.sort(entries);
        return entries;
    }

    public boolean deleteByName(String name, ArrayList<Entry> entries) {
        for (Entry e : entries) {
            if (e.getFirstName().equals(name)) {
                entries.remove(e);
            }
        }
        return false;
    }
}

Если возможно, я бы хотел корректно переопределить метод equals, чтобы его можно было использовать для других операций. Я думаю, что изо всех сил пытаюсь полностью понять, как работает метод равных. Будет ли это наилучшим способом решения проблемы, и может ли он также использоваться для помощи с другими операциями, которые мне нужно выполнить?

...