цикл while не добавляет данные в каждый цикл вновь созданного объекта? в яве

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

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

Программа сначала считывает из текстового файла все исходные данные, чтобы запустить программу. Затем программа имеет цикл 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);        
} 

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

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);
        } 

person Binyomin    schedule 26.10.2011    source источник
comment
Я предполагаю, что я инициализирован нулем перед первым циклом?   -  person Carth    schedule 26.10.2011
comment
Я повторяю свой вопрос, заданный на днях: какие ресурсы вы используете для изучения Java? Кажется, что многие проблемы являются базовыми, проблемами на уровне языка, которые можно быстро решить с помощью обзора основ Java.   -  person Dave Newton    schedule 26.10.2011


Ответы (4)


public static void setAddEmp(Employee theEmp, int idNumber)

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

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

person Bhesh Gurung    schedule 26.10.2011
comment
только потому, что если он не статичен, я получаю сообщение об ошибке, которое не может ссылаться на статический контекст, - person Binyomin; 26.10.2011
comment
может ли это быть причиной проблемы? - person Binyomin; 26.10.2011
comment
@Binyomin: статический означает, что он принадлежит классу. Не все экземпляры будут иметь свои собственные. - person Bhesh Gurung; 26.10.2011
comment
но когда я делаю его статичным, это вызывает больше проблем с памятью, чем оно того стоит. да ладно, я полагаю, у меня нет выбора. ха-ха - person Binyomin; 26.10.2011
comment
Теперь я удаляю большинство статических объявлений в статических методах. и теперь я получаю исключение ошибки в основном потоке, несовместимом с ошибкой изменения класса, ожидаемым статическим методом mainDriver.setEmployee. почему он ожидает статический ?? - person Binyomin; 26.10.2011
comment
@Binyomin: Код, который вы опубликовали до сих пор, очень ограничен, чтобы сказать, что вы на самом деле делаете? Почему бы вам не опубликовать весь класс, вовлеченный здесь. - person Bhesh Gurung; 26.10.2011

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

person Eamonn O'Brien-Strain    schedule 26.10.2011

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

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

person Dave Newton    schedule 26.10.2011
comment
Еще раз спасибо, Дейв, извините, что снова причиняю боль, но как бы я закодировал это иначе, чем то, что у меня есть сейчас, чтобы у каждого отдела был свой собственный экземпляр? - person Binyomin; 26.10.2011
comment
@Binyomin Извинения не нужны :) Вы уже создаете новый экземпляр, просто класс Department не был закодирован так, как будто он ожидает создания экземпляра. Как мы с другими говорили, делайте меньше вещей статичными. - person Dave Newton; 26.10.2011
comment
но когда я делаю его статичным, это вызывает больше проблем с памятью, чем оно того стоит. да ладно, я полагаю, у меня нет выбора. Теперь, когда вы упомянули об этом, имеет смысл, что статический класс приведет к тому, что все его создания будут добавлены только к нему. Хммм, мне придется заставить его работать без статики. Благодарность - person Binyomin; 26.10.2011
comment
@Binyomin Но модель данных такова, что существует несколько отделов. Вот почему я призываю вас ознакомиться с некоторыми основами Java-языка, потому что это очень важный, основополагающий материал, который вы будете использовать каждый день при разработке, будь то Java или другой объектно-ориентированный язык на основе классов. - person Dave Newton; 26.10.2011
comment
Да, как только я запущу эту программу, я снова сяду и заново изучу некоторые основы Java. - person Binyomin; 26.10.2011
comment
хорошо, последний вопрос. Я удалил все статические проблемы из своего кода. Но теперь я получаю сообщение об ошибке: нестатический метод setDepartmentToSystem (Department) не может быть переработан из статического контекста. хорошо, мой mainDriver должен был быть статическим, это единственный способ объявить, так как бы я ссылался на него из нестатического метода. - person Binyomin; 26.10.2011
comment
@Binyomin Это означает, что вы вызываете его из статического метода; его нужно вызывать из экземпляра - это все еще статическая проблема. - person Dave Newton; 26.10.2011
comment
Я объявил свой mainDriver таким образом, чтобы получить первоначальный запуск с помощью public static void main(String[] args) { new MainDriver(); } - person Binyomin; 26.10.2011
comment
должен ли я объявить его так же, как объект MainDriver theMainDriver = new MainDriver(); - person Binyomin; 26.10.2011
comment
@Binyomin Вы не должны выполнять всю работу MainDriver в конструкторе, а что-то вроде MainDriver md = new MainDriver(); md.go(); или что-то в этом роде. Не видя никакого кода, я бы просто предположил. - person Dave Newton; 26.10.2011
comment
ага, это должно быть в отдельном классе от остальной части программы? - person Binyomin; 26.10.2011
comment
@Binyomin Не обязательно; метод main MainDriver может создать MainDriver и использовать его; это типично. - person Dave Newton; 26.10.2011
comment
Еще раз спасибо, Дэйв. Я получаю их с этим, я дам тебе знать, как я пойду. - person Binyomin; 26.10.2011
comment
поэтому, если я объявляю MainDriver как theMainDriver и хочу передать переменную одному из его методов из другого класса. я бы пошел theMainDriver.setEmployee(emp). потому что я пробовал это, и это не сработало - person Binyomin; 26.10.2011
comment
@Binyomin Говорить, что что-то не сработало, бесполезно. Да, если у вас есть экземпляр с именем theMainDriver и есть метод с именем setEmployee, который принимает параметр любого типа emp, он будет работать. Если это не так, то либо одно из этих условий не выполняется, либо произошла ошибка времени выполнения. Пожалуйста, начните новый вопрос, так как он совершенно не связан с исходной проблемой, и это слишком много комментариев. - person Dave Newton; 26.10.2011

Биньомин, я думаю, что твой внутренний контроллер делает неправильно...

while (i < numberOfEmps1 ){ i++; }

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

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

person jayellos    schedule 26.10.2011
comment
Внешний цикл считывает количество сотрудников и использует его для управления внутренним циклом; он должен остановиться после того, как будет считано правильное количество сотрудников (при условии отсутствия проблем с данными). - person Dave Newton; 26.10.2011