如何使用 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 将字符串数组作为参数,并更改您拥有的所有数组。如果那是你想要的,你必须传递一个 Strings 的数组作为参数:

如果您想在 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;
        }
    }
}