2016-09-18 2 views
0

안녕하세요 저는이 프로그램에 문제가있어 학생 정보를 Student 유형의 객체에 저장해야합니다. 저장된 정보 : 성, 등급 및 표. 투표는 ArrayList (Integer)에 저장됩니다. Student 유형의 새 개체를 만들 때마다 Student 유형의 ArrayList (학교의 모든 학생을 저장함)에 추가하면 이전에 만든 Student 개체에 입력 한 새 투표 수가 계속 추가됩니다 ArrayList에 저장됩니다.객체에 ArrayList 전달

예 : 나는 다른 추가 프레디, 5B 및 123 : 나는이 Student 학생들 ArrayList에, 내가 입력 프레디, 5b에주고 123 다음 내가 학생들 ArrayList을 확인하고는 내가 이미 추가 한 학생이 포함되어 추가 학생 제가 입력 한 조쉬, 4t 및 1234에 문의하십시오.

ArrayList에 이미 생성되어 저장되어있는 객체가 수정되는 이유는 무엇입니까? 어떻게 해결할 수 있습니까?

public class Student { 
    private String lastname; 
    private String grade; // example "4b" 
    private ArrayList<Integer> student_votes; 


    public Student(String lastname, String grade, ArrayList<Integer> student_votes) { 
     this.lastname=lastname; 
     this.grade=grade; 
     this.student_votes=student_votes; 
    } 

    public ArrayList getVotes() { 
     return student_votes; 
    } 

    public String getLastname() { 
     return lastname; 
    } 

    public String getGrade() { 
     return grade; 
    } 

    public String toString() { 
     return lastname+" "+grade+" "+getVotes(); 
    } 

    public void print_student (Student student) { 
     System.out.println(student); 
    } 

    public static void print_students(ArrayList<Student> students) { 
     for(Student s : students) { 
      System.out.print(s); 
     } 
     System.out.println(""); 
    } 

    public static void menu() { 
     System.out.println("\nPress 1 to add a student\nPress 2 to remove a student\nPress 3 to print the classroom\nPress 4 to exit"); 
    } 

    public static void main(String[] args) { 
     int choice, nv=0, i=0,average=0; 
     Boolean exit=false; 
     ArrayList<Student> students = new ArrayList<Student>(); 
     ArrayList<Integer> votes = new ArrayList<Integer>(); 
     String lastname = new String(); 
     String grade = new String(); 

     Scanner sc = new Scanner(System.in); 
     Scanner st = new Scanner(System.in); 
     do { 
      menu(); 
      choice=sc.nextInt(); 

      switch (choice) { 
       case 1: System.out.println("Enter your lastname:"); 
         lastname=st.nextLine(); 
         System.out.println("Enter your grade:"); 
         grade=st.nextLine(); 

         System.out.println("Enter the amount of votes"); 
         nv=sc.nextInt(); 



         for(i=0;i<nv;i++) { 
          System.out.println("Enter vote n:"+(i+1));     
          votes.add(sc.nextInt()); 
         } 

         students.add(new Student(lastname,grade,votes)); 
         System.out.println("student added!"); 

         break; 

       case 2: System.out.println("Enter student position: "); 
         nv = sc.nextInt(); 
         students.remove(nv-1); 
         break; 

       case 3: print_students(students); 
         break; 

       case 4: exit = true; 

      } 
     } while (exit==false); 
    } 
} 
+2

왜 스캐너가 두 개입니까? 하나만 사용하고 동일한 목표를 달성 할 수 있습니다. –

+1

모든 학생에게 같은 목록 개체를 설정하고 있습니다. 다른 내용을 원한다면 별도로 구성해야합니다. – shmosel

+0

@shmosel 그래서 모든 학생들에게 arraylist를 만들어야합니까? 그것을 피할 수있는 방법이 있습니까? – BlueJay

답변

0

, 모든 학생은 2 표를 말할 수 같은 투표와 투표의 같은 목록 (과 당신이 목록을 추가 학생 1을 가지고 있으며, 당신은에 목록을 추가 student-2, 3 vote, 그러면 두 학생 모두 5 표를 얻음)

votes = new ArrayList<Integer>(); 
for(i=0;i<nv;i++) 
{ 
    System.out.println("Enter vote n:"+(i+1)); 
    votes.add(sc.nextInt()); 
} 

이제는 괜찮을 것입니다. 또한 필요하지 않은 2 개의 스캐너를 사용하고 있습니다. 1이면 충분합니다.

1

당신은 각 Student에 대해 동일한 ArrayList 객체를 사용하고 있습니다 :

여기에 코드입니다. Student에는 목록의 복사본이 포함되어 있지 않지만 동일한 목록에 대한 포인터가 포함되어 있습니다. 한 포인터를 통해 목록에 계속 추가하면 해당 포인터가 모두 영향을받습니다.

각 학생마다 new ArrayList을 만들어 생성자로 전달해야합니다. 당신은 모든 학생에게 투표를 위해 동일의 ArrayList를 사용하는

1

문제는, 어떤 학생에게 제공 될 모든 투표를 수집하는 하나 개의 ArrayList를 사용하는 투표를 입력의 논리에 자리 잡고 있습니다. 객체를 전달하면

, 당신은 개체를 복사하지 않습니다하지만 당신은 당신의 논리를 모든 학생들이 주에서 투표의 ArrayList를 동일한 참조있을 것이라는 점을 의미하는 객체에 대한 참조를 제공합니다. 이것은 쉽게 각 학생에 대한 새로운 ArrayList를을 작성하여 해결할 수 있습니다

System.out.println("Enter the amount of votes"); 
nv=sc.nextInt(); 
final ArrayList<Integer> votes = new ArrayList<>(); 
for(i=0;i<nv;i++) 
{ 
    System.out.println("Enter vote n:"+(i+1)); 
    votes.add(sc.nextInt()); 
} 

이 당신을 위해 그것을 해결하지만, 정말 당신이 양의 표를 알 것 같은, 내 의견으로는 ArrayList에를 사용하여 아무 소용이 없습니다. 그러면 코드는 다음과 같습니다. 그러나 학생은 배열을 허용하도록 수정해야합니다.

System.out.println("Enter the amount of votes"); 
nv=sc.nextInt(); 
final int[] votes = new int[nv]; 
for(i=0;i<nv;i++) 
{ 
    System.out.println("Enter vote n:"+(i+1)); 
    votes[i] = sc.nextInt(); 
} 
관련 문제