2016-04-10 13 views
-1

sagen wir in einem Paket mit Java verwenden wir 4 Dateien. Erst man sagt StudentModel.java, zweite sagen studentView.java, die dritten studentController.java und vierte studentMain.java.Redundanz in Arraylist beim Eingeben von Objekten der Klasse

nun die Struktur der studentMain.java ist:

package student; 

import java.util.*; 



public class studentMain{ 
    public static void main(String[] args) { 
    menu(); 
} 
    public static void menu(){ 
    Scanner sc = new Scanner(System.in); 
     //fetch student record based on his roll no from the database 
     studentModel model = new studentModel(); 
     //Create a view : to write student details on console 
     studentView view = new studentView(); 
    ArrayList<studentController> list = new ArrayList <studentController>(); 
    int choice=1,roll1=0;boolean flag=false; 
    studentController controller; 
    while(true){ 
     System.out.println("\n************* Main Menu ********************\n"); 
     System.out.println("Enter 1 to input student"); 
     System.out.println("Enter 2 to display all students"); 
     System.out.println("Enter 3 to display a particular student"); 
     System.out.println("Enter 4 to remove a particular student"); 
     System.out.println("Enter 5 to Update the marks of a student"); 
     System.out.println("Enter 6 to exit program"); 
      System.out.println("\n*********************************************\n"); 
     System.out.println("Enter choice : "); 
     choice=sc.nextInt(); 
     switch(choice){ 

      case 1 : 
       list.add((new studentController(model,view)).input()); 
        break; 

      case 2 :controller = new studentController(model,view); 
       for(int i=0;i<list.size();i++){ 
        controller=list.get(i); 
        controller.show_for_all(); 
       } 
       break; 
       case 3 :flag=false; 
        controller= new studentController(model,view); 
       System.out.println("\nEnter Roll Number of Student :"); 
       roll1=sc.nextInt(); 
       for(int i=0;i<list.size();i++){ 
        controller=list.get(i); 
        if(controller.compare_roll(roll1)){ 
         controller.show(); 
         flag=true; 
        break; 
        } 
       } 
       if(!flag) 
        System.out.println("Roll Number Does NOT exist !!"); 
       break; 
      case 4:controller = new studentController(model,view); 
       System.out.println("\nEnter Roll Number of Student :"); 
       roll1=sc.nextInt(); 
       flag=false; 
       for(int i=0;i<list.size();i++){ 
        controller=list.get(i); 
        if(controller.compare_roll(roll1)){ 
         list.remove(i); 
         flag=true; 
         break; 
        } 
       } 
       if(!flag) 
        System.out.println("Roll Number Does NOT exist !!"); 
       break; 
      case 5: 
       controller = new studentController(model,view); 
       System.out.println("\nEnter Roll Number of Student :"); 
       roll1=sc.nextInt(); 
       flag=false; 
       for(int i=0;i<list.size();i++){ 
        controller=list.get(i); 
        if(controller.compare_roll(roll1)){ 
         controller.change_marks(); 
         flag=true; 
         break; 
        } 
       } 
       if(!flag) 
        System.out.println("Roll Number Does NOT exist !!"); 
       break; 
      case 6: 
       System.out.println("Exiting !!!"); 
       System.exit(0); 
       break; 
      default: 
       System.out.println("Wrong Input !!"); 
       break; 
      } 
     } 
    } 
} 

und die Struktur der studentController.java ist:

package student; 

import java.util.*; 
import java.io.*; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 

public class studentController { 
      private studentModel model; 
      private studentView view ; 

public studentController(studentModel model, studentView view){ 
    this.model = model; 
    this.view = view; 
} 

public void show(){ 
    this.view.display(this.model); 
} 
public void show_for_all(){ 
    this.view.display_for_all(this.model); 
} 
public void input(){ 
     String name;//name of student 
     int roll; //roll of student 
     String date;   
     int marks[]=new int [6]; 
     String sub[]=new String[6]; 
     Scanner s = new Scanner(System.in); 
     int m,j;String s1;int fg=0; 
     System.out.println("\t\t ENTER DETAILS OF STUDENT"); 
     System.out.print("Enter name:"); 
     name=s.nextLine(); 

     /*to check if a string contains digits or not*/ 
     for(int h=0;h<name.length();h++){ 
     if(name.charAt(h)=='1' || name.charAt(h)=='2'||name.charAt(h)=='3'||name.charAt(h)=='4'||name.charAt(h)=='5'||name.charAt(h)=='6'||name.charAt(h)=='7'||name.charAt(h)=='8'||name.charAt(h)=='9'){ 
      fg=1; 
      System.out.println("name contains digits enter correctlty"); 
      break; 
     } 
    } 
    if(fg!=1){ 
     System.out.print("Enter roll no:"); 
     roll=s.nextInt(); 
     System.out.println(); 
     /*system generated date*/ 
     SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//dd/MM/yyyy 
      Date now = new Date(); 
      date = sdfDate.format(now); 
     System.out.println("Admission Date : "+date); 
     System.out.println("Enter Subject and marks :"); 
     /*entering the marks of the subjects*/ 
     for(j=0;j<5;j++){ 
      s1=s.next(); 
      m= s.nextInt(); 
      if(m<0 || m>100){   //marks should not > 100 or <0 
       System.out.println("wrong marks entered");break;} 
      sub[j]=s1; 
      marks[j]=m; 
      //total=total+m; 
     } 
     model.set_name(name); 
     model.set_roll(roll); 
     model.set_date(date); 
     model.set_sub_marks(marks,sub); 
     model.set_total(); 
     model.set_cgpa(); 
    } 

    } 
     public boolean compare_roll(int rol){ 
      if(this.model.get_roll()==rol) 
       return true; 
      else 
       return false; 
      } 
     /*function to change the marks of any of the subjects of a particular student*/ 
    public void change_marks(){ 
     int f,sub_code,new_marks; 
     System.out.println("enter no of subjects whose marks needs to be changed"); 
     Scanner s = new Scanner(System.in); 
     f=s.nextInt(); 
    while(f!=0){ 
     System.out.println("Enter subject codes : ");  
     sub_code=s.nextInt(); 
     if(sub_code>=1 && sub_code<=5){ 
      System.out.println("Enter new marks"); 
      new_marks=s.nextInt(); 
      if(new_marks>=0&&new_marks<101) 
      model.change_marks(sub_code,new_marks); 
      else 
      System.out.println("Marks OUT of Range of 0 to 100"); 
      } 
     else 
      System.out.println("Wrong subject code entered"); 
     f--; 
     } 
    } 


}; 

Während neue Einträge für die Eingabe von Daten, ich bin Probleme beim Eingeben der ErsteEintrag für Schüler gibt es keinProblem .Wenn ich die Details für 2.Eintrag des Schülers am Eintritt, die Details des Schülers für ersteEintrag wird immer gelöscht .Und gibt es eine Redundanz Details für den zweiten Schüler werden in den ersten Schüler kopiert.

Zur besseren Erklärung, die ich die Screenshots bin auch:

Details of the First Student Printed

Dies bedeutet, dass der erste Eintrag richtig eingegeben wurde und gespeichert.

Printing the details of all the students

Wenn Sie die Last Screenshot sehen, werden Sie sehen, dass die Details des ersten Schüler wurde von Details des second.And so ersetzt worden, Redundanz ist.

+1

Bitte versuchen Sie ein minimales Beispiel zu erstellen, um Ihr Problem zu demonstrieren. –

+0

In diesem Fall hat MVC Ihre Logik erheblich erschwert. Sie verwenden Controller nicht ordnungsgemäß. Hier sollte nur ein Controller sein. In diesem Fall ist "main" Ihr Controller. – 4castle

+0

@PaulBoddington Grundsätzlich, wenn Sie durch die 'studentMain.java' gehen, werden Sie feststellen, dass ich versucht habe, mit einem Objekt der' studentController-Klasse' in eine Arraylist mit dem angegebenen Typ von '' zu kopieren .Während dies der erste ist Der Eintrag funktioniert einwandfrei, aber beim Eingeben des zweiten Eintrags wird der erste Eintrag gelöscht und der zweite Eintrag zweimal in die Arraylist kopiert. –

Antwort

1

Bevor Sie die Probleme beschreiben, an denen Sie interessiert sind, lassen Sie mich die Probleme beschreiben, an denen Sie (noch) nicht interessiert sind.

Sie scheinen über MVC im Allgemeinen sehr verwirrt zu sein. MVC, als Model-View-Controller, basiert auf der Idee, dass Modelle von Views und Controllern getrennt werden sollten. Das Model ist verantwortlich für die Datenmodellierung, die View ist verantwortlich für die Interaktion mit dem Benutzer und der Controller ist verantwortlich für die Backend-Logik. Ich würde Ihnen daher raten, Ihren Code zu überarbeiten. Glauben Sie mir, am und Sie werden für diese Idee dankbar sein.

Lassen Sie uns jetzt die Probleme sehen, die Sie interessieren.

Sie verwenden ein Objekt, das controller heißt. Dies wird außerhalb des unendlichen Zyklus erzeugt. Dies ist keine gute Idee, da Sie ein Objekt erstellen, ohne zu wissen, dass Sie es tatsächlich benötigen. Was passiert, wenn der Benutzer 6 eingibt? In diesem Fall hast du vergebens Speicher vergeben.So ändern Sie dies:

studentController controller = new studentController(model,view); 

dazu:

studentController controller; 

Jetzt wollen wir die Befehle sehen. Bei Befehl 1 verwenden Sie den Verweis auf controller und fügen ihn der Liste hinzu. Wenn controller aufgrund früherer Iterationen auf das erste Element in der Liste verwiesen wird und Sie dann 1 drücken, fügen Sie dem list das gleiche Objekt hinzu. Dies bedeutet, dass Sie die Referenz auf das Objekt und damit das Problem, über das Sie sich beschweren, duplizieren. Anstatt also diese:

case 1 :controller.input(); 
     list.add(controller); 
     break; 

Sie müssen dies:

 case 1 : { 
      list.add((new studentController(model,view)).input()); 
     } break; 

Sie andere Probleme haben könnte genauso gut (ich habe nicht testen Sie den Code mit meinen Kommentaren), aber ich glaube, diese Antwort ist gut genug, um Ihnen zu helfen, die Probleme zu lösen. Refactorieren Sie den Code auf jeden Fall.