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