簡體   English   中英

如何使用setter來為私有數組的屬性設置值?

[英]How to use setter to set a value to a attribute which is a private array?

我已經制作了一個紙卷編號數組,因此如何使用setter給私有屬性(即紙卷編號)提供用戶輸入。 我做了一個學生類的對象,該students.for(int i=0;i<n;i++) {(setRollno[i](sc.next()))};是一個學生,並嘗試了這個students.for(int i=0;i<n;i++) {(setRollno[i](sc.next()))}; 但這沒有用。

class Students{
    private  String[] rollno = new String[1000];
    private  int[] intel = new int[1000];
    private  int[] type = new int[1000];
    private  String[] name = new String[1000];

    public void setRollno(String[] rollno) {
        this.rollno = rollno;
    }

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

    public void setIntel(int[] intel) {
        this.intel = intel;
    }

    public void setType(int[] type) {
        this.type = type;
    }


    public String[] getRollno() {
        return rollno;
    }

    public String[] getName() {
        return name;
    }

    public int[] getIntel() {
        return intel;
    }

    public int[] getType() {
        return type;
    }
 }

可能是我誤解了您的數據結構的目的,但這聽起來像是您試圖在一個地方全部創建一組學生數據。 如果是這種情況,那么我強烈建議您創建一個Student類,一次僅代表一個學生,然后使用Java Collection Framework中的一個或多個標准類型來輕松找到特定的學生。

例如,您的Student類可以僅包含用於保存一名學生的卷號,姓名和其他數據的字段。 然后,假設您想按卷號快速查找學生,則可以創建Map<String, Student> ,其中映射鍵為卷號,對應的地圖值為具有該卷號的學生。 構造后,只需將新的Student對象放入Map 如果需要按名稱查找學生,則可以創建Map<String, Collection<Student>> (因為一個以上的學生可能具有相同的名稱),並在構造每個新的Student對象后將其放入此名稱圖中。

這可能會導致代碼比諸如問題中所示的多合一自定義集合類易於閱讀,維護和使用。

作為一個粗略的代碼示例:

String rollNumber = getNewRollNumber(); // wherever roll numbers come from
String name = getStudentName(); // wherever the name comes from
Student newStudent = new Student(rollNumber, name, etc);
studentsByRollNumber.put(rollNumber, newStudent);
studentsByName.computeIfAbsent(name,
        n -> new ArrayList<>(1)).add(student);

Student studentWithParticularRollNumber =
        studentsByRollNumber.get("123456");
Collection<Student> studentsWithParticularName =
        studentsByName.get("Perry, Fred");

僅當該名稱下不存在任何條目時, Map#computeIfAbsent方法才會在給定的學生姓名下創建一個新的ArrayList如果該名稱已存在於地圖中,則它將獲取現有列表,然后將新學生放入列表中。

在對computeIfAbsent的調用中,lambda表達式t -> new ArrayList<>(1)簡單含義是“獲取映射鍵的值,無論它是創建一個大小為1的新ArrayList”。 它只是保證如果在給定的學生姓名下還沒有存儲Collection<Student>那么將創建一個新的ArrayList<Student>並將其存儲在該位置。

setRollno[i](sc.next()); 不是好的語法。 您的函數setRollno將字符串數組作為參數,並更改所有數組。 如果這是您想要的,則必須傳遞String數組作為參數:

如果要在rollno設置一個特定的String ,則必須創建另一個函數:

setRollNoAtIndex(int i, String s) {
    this.rollno[i] = s;
}

如果您需要循環調用此函數,則只需執行以下操作:

for(int i=0; i < n ;i++) {
    students.setRollNoAtIndex(i, sc.next());
}

根據伯傑的評論:

您嘗試使用的語法可能是:

for(int i=0; i < n ;i++) {
    students.getRollno()[i] = sc.next();
}

要么

String[] list = new String [1000];
for(int i=0; i < n ;i++) {
    list[i] = sc.next();
}
students.setRollno(list);

我認為此類的設計不正確,因為我們可以直接訪問內部數組。 而且,在這種情況下,您不必在創建新實例時初始化所有這些數組。 我提供了該類的另一種實現,我發現它更適合於該目標:

final class Students {
    private static final int TOTAL = 1000;

    private final Map<String, Student> students = new HashMap<>(TOTAL);

    public void setName(String rollno, String name) {
        getOrCreateStudent(rollno).name = name;
    }

    public void setIntel(String rollno, int intel) {
        getOrCreateStudent(rollno).intel = intel;
    }

    public void setType(String rollno, int type) {
        getOrCreateStudent(rollno).type = type;
    }

    public Set<String> getRollno() {
        return students.keySet();
    }

    public String getName(String rollno) {
        return students.getOrDefault(rollno, Student.NULL).name;
    }

    public int getIntel(String rollno) {
        return students.getOrDefault(rollno, Student.NULL).intel;
    }

    public int getType(String rollno) {
        return students.getOrDefault(rollno, Student.NULL).type;
    }

    private Student getOrCreateStudent(String rollno) {
        Student student = students.get(rollno);

        if (student == null)
            students.put(rollno, student = new Student(rollno));

        return student;
    }

    private static final class Student {
        private static final Student NULL = new Student(null);

        private final String rollno;
        private int intel;
        private int type;
        private String name;

        public Student(String rollno) {
            this.rollno = rollno;
        }
    }
}

暫無
暫無

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

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