【问题标题】:Redundancy in Arraylist while entering Objects of Class输入类对象时Arraylist中的冗余
【发布时间】:2016-04-10 17:37:43
【问题描述】:

假设在使用 Java 的包中,我们使用 4 个文件。第一个说StudentModel.java,第二个说studentView.java,第三个说studentController.java,第四个说studentMain.java强>。

现在studentMain.java的结构是:

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

studentController.java的结构是:

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


 };

在为数据输入新条目时,我遇到了问题。在为学生输入 First entry 时,没有 问题。当我为2ndentry输入学生的详细信息时,第一个学生的详细信息 条目删除。第二个学生的详细信息被复制到第一个学生中,因此存在冗余。

为了更好的解释,我附上了截图:

这意味着第一个条目已正确输入和存储。

如果您看到上一张截图,您会看到第一个学生的详细信息已被第二个学生的详细信息替换。因此存在冗余。

【问题讨论】:

  • 请尝试创建一个最小的示例来演示您的问题。
  • 在这种情况下,MVC 使您的逻辑变得非常复杂。您不正确地使用控制器。这里应该只有一个控制器。在这种情况下,main 是您的控制器。
  • @PaulBoddington 基本上如果你通过studentMain.java,你会发现我已经尝试使用studentController class的对象复制到指定类型为&lt;studentController&gt;的Arraylist中。同时这样做第一个条目工作正常,但在输入第二个条目时,第一个条目被删除,第二个条目被复制到 arraylist 两次。
  • @4castle 我正在使用studentMain 类来显示Main Menu 并从用户那里获取输入,剩下的所有操作都是通过studentController 类的对象通过定义的方法完成的在课堂上studentControllerinput( ) , show( ) ,show_for_all( ) change_marks( )
  • 这有点过分了。 main 是你的看法。

标签: java arrays object arraylist redundancy


【解决方案1】:

在描述您感兴趣的问题之前,让我先描述一下您(尚未)感兴趣的问题。

总体而言,您似乎对 MVC 感到非常困惑。 MVC,作为模型-视图-控制器是基于模型应该与视图和控制器分离的思想。 Model 负责数据建模,View 负责与用户交互,Controller 负责后端逻辑。所以我建议你重构你的代码。相信我,你会感激这个想法的。

现在,让我们看看你感兴趣的问题。

您使用了一个名为controller 的对象。这是在无限循环之外创建的。这不是一个好主意,因为您创建一个对象时并不知道您是否真正需要它。如果用户输入 6 会怎样?在那种情况下,您分配的内存是徒劳的。所以,改变这个:

studentController controller = new studentController(model,view);

到这里:

studentController controller;

现在,让我们看看命令。在命令 1 中,您使用对 controller 的引用并将其添加到列表中。如果 controller 由于先前的迭代而被引用到列表中的第一个元素,然后按 1,则将相同的对象添加到 list。这意味着,您复制了对该对象的引用,从而复制了您抱怨的问题。所以,而不是这个:

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

你需要这个:

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

您可能还有其他问题(我没有根据我的建议测试代码),但我相信这个答案很好——足以帮助您解决问题。无论如何,重构代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多