如何使用 setter 将值设置为私有数组的属性?
How to use setter to set a value to a attribute which is a private array?
我制作了一个卷号数组,因此如何使用 setter 向用户输入卷号的私有属性。
我做了一个 class Students 的对象,它是一个学生并尝试了这个 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;
}
}
setRollno[i](sc.next());
不是好的语法。您的函数 setRollno
将字符串数组作为参数,并更改您拥有的所有数组。如果那是你想要的,你必须传递一个 String
s 的数组作为参数:
如果您想在 rollno
中设置一个特定的 String
,您必须创建另一个函数:
setRollNoAtIndex(int i, String s) {
this.rollno[i] = s;
}
如果你需要在循环中调用它,你可以简单地做:
for(int i=0; i < n ;i++) {
students.setRollNoAtIndex(i, sc.next());
}
根据Berger的评论:
您尝试使用的语法可能是:
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);
可能我误解了你的数据结构的目的,但听起来你正试图在一个地方创建一组学生数据。如果是这种情况,那么我强烈建议创建一个 Student
class 一次只代表一个学生,然后使用 Java 集合框架中的一种或多种标准类型来轻松找到特定学生。
例如,您的 Student
class 可以只包含包含一名学生的卷号、姓名和其他数据的字段。然后,假设您希望通过卷号快速找到学生,您可以创建一个 Map<String, Student>
,其中映射键是卷号,相应的映射值是具有该卷号的学生。只需在构建后将一个新的 Student
对象放入 Map
中即可。如果您需要按姓名查找学生,那么您可以创建一个 Map<String, Collection<Student>>
(因为不止一个学生可能具有相同的姓名)并在构建后将每个新的 Student
对象放入此名称映射中。
这可能会导致代码比一体式自定义集合 class 更容易阅读、维护和使用,例如您问题中显示的那个。
粗略的代码示例:
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)
仅表示 "take the value of the map key, and whatever it is just create a new ArrayList of size one"。它只是保证如果在给定的学生姓名下还没有存储 Collection<Student>
,那么将创建一个新的 ArrayList<Student>
并存储在那里。
我认为这个class的设计是不正确的,因为我们可以直接访问内部数组。此外,在那种情况下,您不必在创建新实例时初始化所有这些数组。我提供了这个 class 的另一种实现,我发现它更适合这个目标:
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;
}
}
}
我制作了一个卷号数组,因此如何使用 setter 向用户输入卷号的私有属性。
我做了一个 class Students 的对象,它是一个学生并尝试了这个 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;
}
}
setRollno[i](sc.next());
不是好的语法。您的函数 setRollno
将字符串数组作为参数,并更改您拥有的所有数组。如果那是你想要的,你必须传递一个 String
s 的数组作为参数:
如果您想在 rollno
中设置一个特定的 String
,您必须创建另一个函数:
setRollNoAtIndex(int i, String s) {
this.rollno[i] = s;
}
如果你需要在循环中调用它,你可以简单地做:
for(int i=0; i < n ;i++) {
students.setRollNoAtIndex(i, sc.next());
}
根据Berger的评论:
您尝试使用的语法可能是:
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);
可能我误解了你的数据结构的目的,但听起来你正试图在一个地方创建一组学生数据。如果是这种情况,那么我强烈建议创建一个 Student
class 一次只代表一个学生,然后使用 Java 集合框架中的一种或多种标准类型来轻松找到特定学生。
例如,您的 Student
class 可以只包含包含一名学生的卷号、姓名和其他数据的字段。然后,假设您希望通过卷号快速找到学生,您可以创建一个 Map<String, Student>
,其中映射键是卷号,相应的映射值是具有该卷号的学生。只需在构建后将一个新的 Student
对象放入 Map
中即可。如果您需要按姓名查找学生,那么您可以创建一个 Map<String, Collection<Student>>
(因为不止一个学生可能具有相同的姓名)并在构建后将每个新的 Student
对象放入此名称映射中。
这可能会导致代码比一体式自定义集合 class 更容易阅读、维护和使用,例如您问题中显示的那个。
粗略的代码示例:
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)
仅表示 "take the value of the map key, and whatever it is just create a new ArrayList of size one"。它只是保证如果在给定的学生姓名下还没有存储 Collection<Student>
,那么将创建一个新的 ArrayList<Student>
并存储在那里。
我认为这个class的设计是不正确的,因为我们可以直接访问内部数组。此外,在那种情况下,您不必在创建新实例时初始化所有这些数组。我提供了这个 class 的另一种实现,我发现它更适合这个目标:
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;
}
}
}