首页 > 解决方案 > 设置一个数组的元素,将其他元素设置为同一个数组

问题描述

我有一个类“college”有一个内部类“Professor”的数组参数这个内部类有一个字符串“Materials”的数组参数,我使用方法“addProfessor”将教授添加到外部类数组中,现在在这个addProfessor方法我创建一个新教授将其材料设置为传递的数组,但是每次我添加一个新教授时,数组中的所有教授都具有相同的材料数组!

这里是教授课

    private class Professor{
    private String Name;
    private ArrayList<String> Materials;
    private String Department;

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public ArrayList<String> getMaterial() {
        return Materials;
    }

    public void setMaterial(ArrayList<String> material) {

        Materials = material;
    }

    public String getDepartment() {
        return Department;
    }

    public void setDepartment(String department) {
        Department = department;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Professor{" + "Name='").append(Name).append('\'').append("Material: ");
        for(String mat : Materials){
            Log.d("Material",mat);
            builder.append(mat).append(",");
        }
        builder.append("Department: ").append(Department);
        return builder.toString();

    }
}

这里添加方法

   public void addProfessor(String Name,@Nullable String department,@Nullable ArrayList<String> materials){
    Professor professor = new Professor();
    professor.setDepartment(department);

    professor.setMaterial(materials);
    professor.setName(Name);
    professorsMap.put(Name,professor);
    Professors.add(professor);
    for(String mat :materials){
        Log.d("ADDPROF",mat);
    }
    for(Professor prof : Professors){
        Log.d("MatProf",prof.toString());
    }
}

我添加的代码(我暗示了与教授数组无关的代码)

    ArrayList<String> profMaterials = new ArrayList<>();
    submitMat.setOnClickListener(v -> {
        if(!professorMaterialLayout.getEditText().getText().toString().isEmpty()) {
            profMaterials.add(professorMaterialLayout.getEditText().getText().toString());
            professorMaterialLayout.getEditText().setText("");
        }
    });

    submitTeacher.setOnClickListener(v -> {

        String counterString = staffNumber.getText().toString();
        int Count = Integer.parseInt(counterString.subSequence(counterString.indexOf("#")+1,counterString.length()).toString());
        if(!professorNum.getText().toString().isEmpty()&&!assistantNumb.getText().toString().isEmpty()) {
            if (Count == Integer.parseInt(professorNum.getText().toString())&&counterString.contains("Professor")) {
                college.addProfessor(professorNameLayout.getEditText().getText().toString()
                        ,professorDepartmentLayout.getEditText().getText().toString()
                        ,profMaterials);
            
                profMaterials.clear();
        }else{

        
                    college.addProfessor(professorNameLayout.getEditText().getText().toString()
                            ,professorDepartmentLayout.getEditText().getText().toString()
                            ,profMaterials);
                    profMaterials.clear();
                  
            }
        }
    });*emphasized text*

标签: android

解决方案


您不是Material在任何地方创建数组列表的新实例,Professor而是直接引用传递的Material列表,这对所有的都是相同的Professors,将您的addProfessor方法修改为下面

public void addProfessor(String Name,@Nullable String department,@Nullable ArrayList<String> materials){
    Professor professor = new Professor();
    professor.setDepartment(department);
    //create new instance for each professor
    professor.setMaterial(new ArrayList<>(materials));
    professor.setName(Name);
    professorsMap.put(Name,professor);
    Professors.add(professor);
    for(String mat :materials){
        Log.d("ADDPROF",mat);
    }
    for(Professor prof : Professors){
        Log.d("MatProf",prof.toString());
    }
}

推荐阅读