Как сохранять объекты в коллекции по ключу

Что я сделал: считал из программы информацию, проверил на валидность, создал 3 класса Employee, Departament, Task (это главный)

Проблема: для каждого объекта Employee новый объект Department. У меня каждый сотрудник работает в своем уникальном подразделении, а нужно, чтобы все сотрудники из второго подразделения, относились ко второму, а из первого, к первому.

    public static void main(String[] args)  throws IOException{
        Map<String, Department> DepEmployee = new HashMap<>();

        String path = args.length > 0 ? args[0] : null;

        assert path != null;
        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "CP1251")); br) {
            while (true) {
                String line = br.readLine();
                if (line == null)
                    break;
                if (Check(line) != null) {
                    String[] strings = line.split("/");
                    Employee emp = new Employee(strings[0], new BigDecimal(strings[1]));
                    Department dep = new Department(strings[2]);
                    dep.addEmployee(emp);
                    System.out.println(strings[0] + " " + strings[1] + " " + strings[2] + " - корректна, обрабатываем");
                }
            }
            for (Map.Entry<String, Department> entry : DepEmployee.entrySet())
                System.out.println(entry.getKey() + " - " + entry.getValue());
}

Ответы (1 шт):

Автор решения: Сабир Исламов

Для начала я бы порекомендовал сделать где-то класс, который будет хранить все созданные тобой объекты (сотрудники, департаменты) в списках. Это будет что-то типа импровизации базы данных (mock-ет), затем убедиться, что все твои классы которые просто являются объектами хранения данных имплементируют интерфейс java.io.Serializable (или для сложных объектов интерфейс java.io.Externalizable, но этот вариант чуть посложней, так как требует реализовать некоторые методы этого интерфейса. В отличии от java.io.Serializable, который не содержит ни каких методов)

У тебя должно получиться что-то вроде:

public class Employee implements Serializable{
   ...
}

public class Department implements Serializable{
   ...
}

public class MyCoolDB implements Serializable{
   List<Employee> employers;
   List<Department> departments;
   ...
}

Далее в твоем классе где у тебя идет чтение и запись всех этих объектов. Для чтения готового объекта-хранилища из файла:

    ObjectInputStream is = new ObjectInputStream(new FileInputStream(filename));
    MyCoolDB myCoolDB = is.readObject();

Для записи этого объекта в файл:

    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename2));
    oos.writeObject(myCoolDB);

Хранить в том виде в котором ты хочешь опасно тем, что файл не имеет структуры понятной машине, и ещё проще эту структуру нарушить. По этому лучше все накопленные данные хранить/передавать в сериализованном виде, но для больших проектов это тоже не вариант, так как объектов у тебя может накопиться уже на несколько гигабайт, а это файле хранить уже будет накладно, да и данные можешь начать терять если на пример вырубили свет до того, как ты корректно выключил своё приложение и не успел сериализовать все данные. По этому нужно изучать java.persistence, но и сериализация очень часто в проектах используется, по этому про неё тоже почитай - там все легко.

P.S.: А уже после изучения теории по языку, обязательно нужно изучать теорию по паттернам проектирования ПО, так как в общем-то архитектура твоего приложения будет необслуживаемой, если грамотно не разграничить данные, обработчики данных, способы представления (ну это конечно же я про MVC - ужасный и могучий паттерн :) )

→ Ссылка