ในขณะที่ลูปไม่เพิ่มข้อมูลให้กับแต่ละลูปวัตถุที่สร้างขึ้นใหม่? ในชวา

สวัสดีทุกคนอีกครั้ง ขอขอบคุณที่สละเวลาตรวจสอบปัญหาของฉัน

ฉันกำลังพยายามสร้างโปรแกรมที่ติดตามพนักงานและแผนกต่างๆ ที่พวกเขาทำงานอยู่

ขั้นแรกโปรแกรมจะอ่านข้อมูลเริ่มต้นทั้งหมดจากไฟล์ข้อความเพื่อให้โปรแกรมดำเนินต่อไป โปรแกรมจะมี while loop ภายใน while loop วงแรกจะอ่านรายละเอียดแผนกแล้วจึงสร้างแผนก

จากนั้นวงถัดไป (ด้านใน) จะอ่านพนักงานทั้งหมดที่เกี่ยวข้องกับแผนกนี้ จากนั้นหลังจากอ่านรายละเอียดของพนักงานแล้ว จะสร้างพนักงานและเพิ่มไปยังแผนกที่สร้างขึ้นก่อนหน้านี้เพื่อบอกว่านี่คือแผนกที่ฉันทำงานอยู่

หลังจากเพิ่มพนักงานทั้งหมดเข้าไปในแผนกแล้ว มันจะออกจากลูปภายในนั้นและส่งแผนกที่มีพนักงานอยู่ข้างในไปยัง 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: static หมายความว่าเป็นของคลาส ไม่ใช่ทุกอินสแตนซ์ที่จะมีเป็นของตัวเอง - 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
ขอบคุณอีกครั้ง Dave ขอโทษที่ทำให้เจ็บปวดอีกครั้ง แต่ฉันจะเขียนโค้ดให้แตกต่างจากที่ฉันมีตอนนี้ได้อย่างไร เพื่อให้แต่ละแผนกมีตัวอย่างของตัวเอง - person Binyomin; 26.10.2011
comment
@Binyomin ไม่จำเป็นต้องขอโทษ :) คุณกำลังสร้างอินสแตนซ์ใหม่แล้ว เพียงแต่ว่า Department คลาสนั้นไม่ได้ถูกเข้ารหัสเหมือนกับที่ คาดหวัง ที่จะถูกสร้างอินสแตนซ์ อย่างที่ผมและคนอื่นๆ พูดไว้ จงทำให้สิ่งต่างๆ คงที่น้อยลง - person Dave Newton; 26.10.2011
comment
แต่เมื่อฉันทำให้มันคงที่ มันก็ทำให้เกิดปัญหาเกี่ยวกับความทรงจำ มันก็คุ้มค่า โอ้ ฉันคิดว่าฉันไม่มีทางเลือก เมื่อคุณพูดถึงมัน มันก็สมเหตุสมผลแล้วที่คลาสแบบคงที่จะทำให้การสร้างสรรค์ทั้งหมดของมันถูกเพิ่มเข้าไปเท่านั้น อืม ฉันจะต้องทำให้มันทำงานโดยไม่มีแบบคงที่ ขอบคุณ - person Binyomin; 26.10.2011
comment
@Binyomin แต่โมเดลข้อมูลมีหลายแผนก นี่คือเหตุผลที่ฉันขอแนะนำให้คุณลองดูข้อมูลพื้นฐานเกี่ยวกับ Java บางส่วน เนื่องจากนี่คือสิ่งสำคัญและเป็นพื้นฐานที่คุณจะใช้ทุกวันที่คุณกำลังพัฒนา ไม่ว่าจะเป็นในภาษา Java หรือภาษา OO ที่ใช้คลาสอื่น - person Dave Newton; 26.10.2011
comment
ใช่ เมื่อฉันเริ่มโปรแกรมนี้ ฉันจะนั่งลงและเรียนรู้พื้นฐานของ Java อีกครั้ง - person Binyomin; 26.10.2011
comment
โอเค ประเด็นสุดท้าย ฉันได้ลบปัญหาคงที่ทั้งหมดออกจากโค้ดของฉันแล้ว แต่ตอนนี้ฉันได้รับข้อผิดพลาด non-static method setDepartmentToSystem(Department)cannot be refrenced from a static context. เอาล่ะ mainDriver ของฉันต้องคงที่ซึ่งเป็นวิธีเดียวที่จะประกาศ ดังนั้นฉันจะอ้างอิงมันจากวิธีที่ไม่คงที่ได้อย่างไร - person Binyomin; 26.10.2011
comment
@Binyomin นั่นหมายความว่าคุณกำลังเรียกมันจากวิธีคงที่ จำเป็นต้องเรียกจากอินสแตนซ์ - ยังคงเป็นปัญหาคงที่ - person Dave Newton; 26.10.2011
comment
ฉันได้ประกาศ mainDriver ของฉันเช่นนี้เพื่อให้การเริ่มต้นใช้งานครั้งแรก heppening 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
aha มันควรจะแยกคลาสออกจากคลาสที่เหลือโดยสิ้นเชิงใช่ไหม? - person Binyomin; 26.10.2011
comment
@Binyomin ไม่จำเป็น; เมธอด main ของ MainDriver สามารถสร้าง MainDriver และใช้งานได้ นั่นเป็นเรื่องปกติ - person Dave Newton; 26.10.2011
comment
ขอบคุณเดฟอีกครั้ง ฉันได้รับมันแล้ว ฉันจะแจ้งให้คุณทราบว่าฉันจะไปอย่างไร - person Binyomin; 26.10.2011
comment
ดังนั้นหากฉันประกาศ MainDriver เป็น MainDriver และฉันต้องการส่งตัวแปรไปยังวิธีใดวิธีหนึ่งจากคลาสอื่น ฉันจะไป 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