в то время как цикл не добавляет данные к каждому циклу, вновь созданному объекту? в java

#java #while-loop #instantiation #setter

#java #в то время как цикл #создание экземпляра #сеттер

Вопрос:

Привет всем, еще раз спасибо, что нашли время, чтобы рассмотреть мою проблему.

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

Программа сначала считывает из текстового файла все исходные данные, чтобы запустить программу. Затем программа выполняет цикл while в цикле while. Первый цикл считывает сведения об отделе, а затем создает отдел

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

после добавления всех сотрудников в отдел, затем он выходит из этого внутреннего цикла и отправляет отдел с сотрудниками внутри него в mainDriver для хранения. Он делает это для остальных отделов, снова добавляя связанных с ними сотрудников и так далее.

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

Могу ли я, пожалуйста, получить некоторую помощь, чтобы понять, где я могу ошибаться.

это код, который считывается в данных.

  while  (index < numberOfDepartmentsToRead ) 
{
        String depName1    = inFile.nextLine();
        String location1     = inFile.nextLine();
        String numberOfEmps = inFile.nextLine();
        int    numberOfEmps1 = Integer.parseInt(numberOfEmps);
        Department newDepartment = new Department(depName1 , location1);

    while (i < numberOfEmps1 )
    {
        String fName     = inFile.nextLine();
        String lName     = inFile.nextLine();
        String gender    = inFile.nextLine();
        String address   = inFile.nextLine();
        String   payLevel  = inFile.nextLine(); 
        int dPayLevel = Integer.parseInt(payLevel);
        Employee employeesFromList = new Employee(randomIDno, fName, lName, gender, dPayLevel);
        newDepartment.setAddEmp(employeesFromList, randomIDno);
        i  ;
    }

    i = 0;
    index  ;
    MainDriver.setDepartmentToSystem(newDepartment);        
} 
 

сотрудник передается этому методу в классе departments

 public static void setAddEmp(Employee theEmp, int idNumber)
{
    employeesInThisDepartment.add(theEmp);
    employeeMap.put(idNumber, theEmp);
}
 

отдел добавляется в метод хранения классов mainDriver, который является следующим

 public static void setDepartmentToSystem(Department theDepartment)
        {

            allDepartments.add(theDepartment);
        } 
 

Комментарии:

1. Я предполагаю, что i инициализируется нулем перед первым циклом?

2. Я повторяю свой вопрос с другого дня — какие ресурсы вы используете для изучения Java? Похоже, что многие проблемы являются базовыми проблемами на уровне языка, которые быстро решаются с помощью обзора основ Java.

Ответ №1:

 public static void setAddEmp(Employee theEmp, int idNumber)
 

Почему он статичен? Сделайте его методом экземпляра.

Сделайте employeesInThisDepartment переменную экземпляра вместо статической.

Комментарии:

1. только потому, что, если он не является статическим, я получаю сообщение об ошибке, не могу ссылаться на статический контекст,

2. может ли это быть причиной проблемы?

3. @Binyomin: статический означает, что он принадлежит классу. Не у всех экземпляров будут свои собственные.

4. но когда я делаю его статическим, это вызывает проблемы с памятью, тогда это стоит. ну, я полагаю, у меня нет выбора. ха-ха

5. Сейчас я удаляю большинство статических объявлений в методах, которые являются статическими. и теперь я получаю сообщение об ошибке «исключение в основном потоке несовместимо с ошибкой изменения ожидаемого статического метода mainDriver.setEmployee». почему он должен ожидать статического??

Ответ №2:

Возможно, вы захотите проверить свое использование static . Трудно понять, не видя всего вашего кода, но мне интересно setAddEmp , не должен ли быть статический метод.

Ответ №3:

Ваша employeesInThisDepartment static переменная, тогда как вам нужна одна для каждого Department .

У каждого Department должен быть свой собственный экземпляр со employees свойством, к которому добавляются сотрудники отдела. Аналогично, метод добавления сотрудника в отдел должен быть методом экземпляра, а не статическим.

Комментарии:

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

2. @Binyomin Извинений не требуется 🙂 Вы уже создаете новый экземпляр, просто Department класс не был закодирован так, как он ожидает создания экземпляра. Как и другие, и я сказал, сделайте меньше статичных вещей.

3. но когда я делаю его статическим, это вызывает проблемы с памятью, тогда это стоит. ну, я полагаю, у меня нет выбора. Теперь, когда вы упомянули об этом, имеет смысл, что статический класс приведет к тому, что все его создания будут добавлены только к нему. хммм, мне придется заставить его работать без статики. Спасибо

4. @Binyomin Но модель данных такова, что существует несколько отделов. Вот почему я рекомендую вам ознакомиться с некоторыми основами языка Java, потому что это критический, основополагающий материал, который вы будете использовать каждый день при разработке, будь то на Java или другом языке OO на основе классов.

5. Да, как только я запущу эту программу, я сяду и снова изучу некоторые основы Java.

Ответ №4:

Binyomin, я думаю, что ваш внутренний контроллер while ошибается…

 while (i < numberOfEmps1 ){ i  ; }
 

Я думаю, что этот цикл будет проходить через всех сотрудников в файле. Затем следующая итерация внутреннего цикла вернет EOF…

Попробуйте опубликовать свою файловую структуру..

Комментарии:

1. Внешний цикл считывает количество сотрудников и использует его для управления внутренним циклом; он должен остановиться после считывания правильного количества сотрудников (при условии отсутствия проблем с данными).