IO Java. Проблемы с удалением и поиском

151
16 декабря 2018, 21:00

Новичок в Java, учусь. Возникла проблема с удалением и поиском во время решения. Подскажите что делаю не так. Заранее большое спасибо.

import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Employee implements Serializable {
    List<Employee> arrayEmployee = new ArrayList<>();
    private String name;
    private int age;
    private int salary;
    private String job;
    public Employee(String name, int age, int salary, String job) {
        this.name = name;
        this.age = age;
        this.salary = salary;
        this.job = job;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public int getSalary() {
        return salary;
    }
    public String getJob() {
        return job;
    }
    boolean writeToFile(Employee employee) {
        Writer writer = null;
        try {
            writer = new FileWriter("Employee.txt", true);
            for (Employee list : arrayEmployee) {
                writer.write(String.valueOf(list) + "\n");
            }
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
        return false;
    }
    boolean save(Employee employee) {
        arrayEmployee.add(employee);
        writeToFile(employee);
        return false;
    }
    boolean delete(Employee employee) {
        arrayEmployee.remove(employee);
        writeToFile(employee);
        return false;
    }
    boolean getByName(String name) {
        for (Employee list : arrayEmployee) {
            if (list.equals(name)) {
                System.out.println("You found an employee named " + name);
            } else {
                System.out.println("Not found");
            }
        }
        return false;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                ", job='" + job + '\'' +
                '}';
    }
}

И Main.

public class Main {
    public static void main(String[] args) {
        Employee employee1 = new Employee("Jack", 30, 10000, "IBM");
        Employee employee2 = new Employee("John", 20, 7000, "Apple");
        employee1.save(employee1);
        employee2.save(employee2);
        employee1.delete(employee1);
        employee1.getByName("Jack");
    }
}
Answer 1

Я бы сделал так (если правильно понял задачу):

public class Employee {
    private String name;
    private int age;
    private int salary;
    private String job;
    public Employee(String name, int age, int salary, String job) {
        this.name = name;
        this.age = age;
        this.salary = salary;
        this.job = job;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public int getSalary() {
        return salary;
    }
    public String getJob() {
        return job;
    }
    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                ", job='" + job + '\'' +
                '}';
    }
}

Main

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
public class Main {
private static List<Employee> arrayEmployee = new ArrayList<>();
static boolean save(Employee employee) {
    arrayEmployee.add(employee);
    writeToFile(employee);
    return false;
}
static boolean writeToFile(Employee employee) {
    Writer writer = null;
    try {
        writer = new FileWriter("Employee.txt", true);
        for (Employee list : arrayEmployee) {
            writer.write(String.valueOf(list) + "\n");
        }
        writer.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (writer != null) {
            try {
                writer.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
    return false;
}
static boolean delete(Employee employee) {
    arrayEmployee.remove(employee);
    writeToFile(employee);
    return false;
}
static boolean getByName(String name) {
    for (Employee employee : arrayEmployee) {
        if (employee.getName().equals(name)) {
            System.out.println("You found an employee named " + name);
        } else {
            System.out.println("Not found");
        }
    }
    return false;
}
public static void main(String[] args) {
    Employee employee1 = new Employee("Jack", 30, 10000, "IBM");
    Employee employee2 = new Employee("John", 20, 7000, "Apple");
    save(employee1);
    save(employee2);
    delete(employee1);
    getByName("Jack");
}
}
Answer 2

1). Проблема с удалением у Вас из-за того, что Вы используете метод remove и ожидаете, что Java сама "угадает" какой именно элемент Вы пытаетесь удалить. Если посмотреть в исходный код метода remove класса ArrayList, то можно увидеть, что происходит обход внутреннего массива значений и для каждого из них вызывается сравнение методом equals с удаляемым (переданным в метод remove) объектом. Тут мы подходим к истокам ошибки. Метод equals в классe Object выполняет лишь сравнение по ссылке. Если Вы хотите, чтобы работа с коллекциями Ваших объектов происходила корректно, Вам необходимо в Вашем объекте переопределить метод equals, объяснив тем самым как правильно сравнивать Ваши объекты. Подробнее про это пишет Джошуа Блох в своей книге "Effective Java". Советую к прочтению, после того как изучите азы.

2) Проблема с поиском. Тут у Вас вперемешку непонимание работы метода equals с неверным кодом. Ваш метод getByName принимает строку name, т.е. предполагается искать работника по его name. Но Вы зачем-то сравниваете всего работника с переданным name. Вам нужно сравнивать employee.name c переданным name.

READ ALSO
Пространство до строки в JavaScript

Пространство до строки в JavaScript

У меня программа, которая должна делать все слова с большой буквыЯ написал версию, которая делает слова с заглавной после первого слова

159
LEFT JOIN в sequelize

LEFT JOIN в sequelize

Использую mysql и sequelize в Nodejs проекте

185
Не работает маска ввода MaskedInput

Не работает маска ввода MaskedInput

Маска подключена два разаПервый раз работает второй - нет

181
Canvas HTML5. Случайные линии

Canvas HTML5. Случайные линии

Решил написать функцию рисования случайных линий:

171