2
    List<Student> studentInfo = new LinkedList<Student>();

    int choice;
    boolean flag = true;
    Student student = new Student();


    while(flag)
    {
        System.out.println();
        System.out.println("Press 1 to Add Student details");
        System.out.println("Press 2 to Display Student details");
        System.out.println("Press 3 to Sort");
        System.out.println("Press 4 to Search");
        System.out.println("Press 5 to Exit");
        System.out.println("Enter your choice: ");
        choice = sc1.nextInt();

        switch(choice)
        {
            case 1:  studentInfo.add(student.addDetails());
                     break;

            case 2:  System.out.println("Details of Students are as follows: ");
                     for(Student s : studentInfo){
                         System.out.println(s);
                     }
                     break;
            //More code

Student 类中的 addDetails() 方法是:

        public Student addDetails() 
        {
             System.out.println("Enter the name: ");
             name = sc2.nextLine();
             this.setName(name);
             return this;
        }

我正在使用案例 1 块获取学生详细信息,然后将它们添加到 studentInfo 集合中。但是,当我显示最后输入的详细信息时,会覆盖所有以前的详细信息,当我打印出来时,只会显示我添加的学生数量。有人可以告诉我我做错了什么吗?谢谢!

输出:学生的详细信息如下:name=Amar,age=0,term=0,sub_1_marks=0,sub_2_marks=0,sub_3_marks=0,percentage=0,totalMarks=0 name=Amar,age=0,term= 0,sub_1_marks=0,sub_2_marks=0,sub_3_marks=0,百分比=0,totalMarks=0

4

1 回答 1

2

您不确定这个问题的答案这一事实意味着它的答案可能会随着您的代码的发展而改变。如果您专注于您的代码随着时间的推移而发展的事实,您通常会看到正确的路径。

对我来说,这段代码已经有问题了。事实上,如果你想添加一个新的菜单选项,你必须在两个不同的地方添加代码(打印列表和 case 语句)。

我首先将这两个领域重新组合到一个单一的行动列表中。像这样的东西:

static boolean exit = false;

enum Action {
  AddDetails("Add student details") {
    @Override
    public void doIt() {
      // How to add details.
    }

  },
  DisplayDetails("Display student details") {
    @Override
    public void doIt() {
      // How to display details.
    }

  },
  SortDetails("Sort") {
    @Override
    public void doIt() {
      // How to sort details.
    }

  },
  SearchDetails("Search") {
    @Override
    public void doIt() {
      // How to search details.
    }

  },
  Exit("Exit") {
    @Override
    public void doIt() {
      // How to exit.
      exit = true;
    }

  };
  private final String description;

  Action(String description) {
    this.description = description;
  }

  public String getDescription() {
    return description;
  }

  public abstract void doIt();

}

public static void main(String args[]) {
  try {
    Scanner sc1 = new Scanner(System.in);
    do {
      // Show my menu.
      for (Action a : Action.values()) {
        System.out.println("Press " + a.ordinal() + " to " + a.getDescription());
      }
      System.out.println("Enter your choice: ");
      int choice = sc1.nextInt();
      // Should really do some range checks here.
      Action action = Action.values()[choice];
      // Perform the chosen function.
      action.doIt();
    } while (!exit);
  } catch (Throwable t) {
    t.printStackTrace(System.err);
  }
}

所以 - 回答你的问题 - 使用static methods机制但只使用概念。Enum如果您有许多不同的操作,s 是一个很好的替代品。

于 2013-09-11T11:36:10.393 回答