在Java

时间:2015-06-07 09:43:18

标签: java arrays

我创建了一个继承层次结构,其中包含一个名为Employe的超类和两个名为Lecturer和Assistant的子类。除此之外,我还创建了一个名为Subject的课程,其中包含一系列员工。

我想在这里做的是创建一个方法,将Employe对象添加到数组中 我做了同样适用于ArrayList的那个,但它似乎不适用于Arrays。

如果可能的话,我怎样才能创建一个与数组做同样事情的方法?

public class Subject {

    private String subjectcode;
    private Employe[] employees;

    public Subject(String subjectcode) {
        this.subjectcode = subjectcode;
        Employe[] employees = new Employe[5];
    }

    public void setSubjectcode(String code) {
        this.subjectcode = code;
    }

    public String getSubjectcode() {
        return this.subjectcode;
    }

    public boolean addStaff(Employe employe) {
        if (employe instanceof Lecturer || employe instanceof Assistant) {
            this.employees.add(employe);
            return true;
        } else {
            return false;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您需要使用ArrayList:

public class Subject
{   
    private String subjectcode;
    private final List<Employee> employees = new ArrayList<Employee>();

    public Subject(String subjectcode){
        this.subjectcode = subjectcode;
}

public boolean addStaff(Employe employe){
        return this.employees.add(employe);
 }

或者如果您仍想使用数组:

public boolean addStaff(Employe employe){
        List<Employee> tempList = Arrays.asList(this.employees);
    boolean added = tempList.add(employe);
    this.employees = tempList.toArray(this.employees);
    return added;
 }

答案 1 :(得分:2)

数组不能像ArrayList那样自动增长或缩小,这就是为什么没有add()方法 - 它会在数组实例后停止工作已满了。

您对数组所拥有的内容基本上是get(index)set(index, value),因此当您知道最多只有N名员工时,Subject可能会像这样:

public class Subject {   

    private static final int N = 5;
    private String subjectcode;
    private Employe[] employees = new Employe[N];
    private int size = 0;

    public Subject(String subjectcode){
        this.subjectcode = subjectcode;
    }

    public void setSubjectcode(String code){
        this.subjectcode = code;
    }

    public String getSubjectcode(){
        return this.subjectcode;
    }

    public boolean addStaff(Employe employe){
        if (size == employees.length) {
          // cannot add when is full
          return false;
        }

        if(employe instanceof Lecturer || employe instanceof Assistant){
            this.employees[size++] = employe;
            return true;
        }
        return false;
    }
}

另一方面,如果您不知道在创建Subject时主题可能有多少员工(如果您已经知道,您可以通过{{1作为一个构造函数参数),你必须实现增长内部数组的方法,并在添加新的雇员时调用它,这可能如下所示:

N

有关增长数组的更好示例,请参阅JDK中private void ensureCapacity(int n) { int oldCapacity = employees.length; if (oldCapacity >= n) { // there's nothing to do return; } // grow at least in half, to minimize copying data on each add int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - n < 0) newCapacity = n; employees = Arrays.copyOf(employees, newCapacity); } public boolean addStaff(Employe employe) { ensureCapacity(size + 1); if (employe instanceof Lecturer || employe instanceof Assistant) { this.employees[size++] = employe; return true; } return false; } ArrayList的{​​{3}}。

但同样,这种不断增长的东西只是为了重新实现ensureCapacity(int minCapacity)中已经完成的工作。

答案 2 :(得分:1)

对于Java数组,与ArrayList不同,您没有add方法。所以,你不能添加它。数组操作如下:

        String[] employees = new String[5];
        employees[0] = "ad";

因此,数组需要基于索引的方法,你指定在索引0处放置此元素,在索引1处放置此元素,依此类推.... employees[0] = "as";

在您的情况下,为什么需要使用数组?根据您提供的信息,我认为ArrayList最合适。