[英]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.