簡體   English   中英

Java類和掃描儀

[英]Java classes and Scanner

我正在學習Java並從類開始,但現在有一些疑問。

我要用來自學生,班級和椅子的數據制作程序。 例如,來自學生數據的信息將用於教室和椅子。 現在,我將限制自己局限於班級學生。

每個學生都有名字和生日。 我以為我要用學生數據創建一個班級,然后將學生數據保存在兩個數組中。 名稱的字符串的一維數組,日期(年,月,日)的三列數組。

我首先使用以下代碼創建Student類:

    public class Stundent{
        private String nameStudent;
        private int yearBirth;
        private int monthBirth;
        private int dayBirth;

        public void setName(String name){
            System.out.println("Insert student's name:");
            nameStudent = name;

        }
        public String getName(){
            return nameStudent;
        }
        public void setYear(int year){
            System.out.println("Insert student's year of birth:");
            yearBirth = year;
        }
        public int getYear(){
            return yearBirth;
        }
        public void setMonth(int month){
            System.out.println("Insert student's month of birth:");
            monthBirth = month;
        }
        public int getMonth(){
            return monthBirth;
        }
        public void setDay(int day){
            System.out.println("Insert student's day of birth:");
            dayBirth = day;
        }
        public int getDay(){
            return dayBirth;
        }
    }

然后在主文件中就想到了這種方式:

            Student person = new Student();
            String[] nameStudents = new String[100];
            int[][] birthdayStudents = new int[100][3];
            for (int i = 0; i < 3; i++){

                person.setName(sc.nextLine());
                nameStudents[i] = person.getName();

                person.setAno(sc.nextInt());
                birthdayStudents[i][1] = person.getAno();

                person.setMes(sc.nextInt());
                birthdayStudents[i][1] = person.getMes();

                person.setDia(sc.nextInt());
                birthdayStudents[i][2] = person.getDia();

            }

第一個問題:

忘記由於掃描儀而無法正常工作,這是正確的思維方式嗎?

第二個問題:

如果我運行此代碼,則將出現以下情況:將顯示給我“插入學生的姓名:”,但是如果我放置Maria,則將出現InputMismatchException。 我相信他一年會儲存瑪麗亞。 為什么會這樣? 在同一for周期中,我最多只能打一個電話給掃描儀嗎? 如果我只輸入代碼:

person.setName(sc.nextLine());
nameStudents[i] = person.getName();

並刪除所有其他有關生日的內容,即可正常運行。 誰能啟發我?

我認為這不是正確的方法。 您將實體Student與輸入相關信息混合在一起。 我將重新設計如下(稍微減少了Student ):

/* just an entity, no logic at all */
public class Student {
    private String name = null;
    private Integer year = null;

    public void setName(String name){
        this.name = name;
    }

    public void setYear(Integer year){
        this.year = year;
    }
}

以及獲取用戶輸入的邏輯:

List<Student> students = new ArrayList<Student>();
int numberOfStudents = 3;

for (int i = 0; i < numberOfStudents; i++){
    System.out.println("Please enter name:");
    String name = sc.nextLine();

    System.out.println("Please enter year:");
    Integer year = sc.nextInt();

    /* after gathering the input create student */
    Student s = new Student();
    s.setName(name);
    s.setYear(year);

    students.add(s);
}

將學生對象本身保存在列表中怎么辦?

List<Student> studentList = new ArrayList<Student>();
studentList.add(student);

另外,當您從掃描儀中檢索信息時,請將那些信息(例如名稱,年齡等)分配給一個臨時對象,以便您可以對它們進行一些驗證。

String temp = sc.nextLine();

驗證“ temp”,如果您要存儲在該人的名字中,則從該人的班級調用setter。

在對象上調用任何setter方法之前,最好先驗證用戶輸入。

看來您正在將收集信息的責任划分在主塊中的代碼和Stundent (請注意拼寫錯誤)類中的代碼之間。

我將集中精力考慮類的職責,並確保類中沒有直接處理該類職責的多余代碼。 例如,如果Student要保留其名稱,則名稱字段應在Student內部(您是通過這種方式完成的,這很有意義)。 但是,如果要更新學生的姓名,則在為Student分配一個名稱后,通過println語句提示它要求一個名稱是沒有意義的。

也許您需要一個StudentReader類,該類可以讀取輸入,然后構造Student對象。 這樣的讀者將承擔全部正確提示和讀取值的唯一責任,最終結果是一個構造Student 然后,主要塊基本上是一個循環,以使用StudentReader讀取每個學生,以及一個部分來收集讀取的Student並進行相應處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM