【发布时间】: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的对象复制到指定类型为<studentController>的Arraylist中。同时这样做第一个条目工作正常,但在输入第二个条目时,第一个条目被删除,第二个条目被复制到 arraylist 两次。 -
@4castle 我正在使用
studentMain类来显示Main Menu并从用户那里获取输入,剩下的所有操作都是通过studentController类的对象通过定义的方法完成的在课堂上studentController像input( ) , show( ) ,show_for_all( )和change_marks( ) -
这有点过分了。
main是你的看法。
标签: java arrays object arraylist redundancy