在我的作业中,我应该编写born()
和addChildren()
方法。禁止使用List
,因此我们只允许使用数组。每个Person都有一个对象数组作为其实例变量(子)。我申报时应该放一个恒定的尺寸吗?例如;
private Person[] children = new Person[5];
或者在创建大小为0的children[]
之后是否可以使用这样的方法?
private Person[] children = new Person[0];
public void addChildren(Person x){
Person[] newArray = new Person[children.length+1];
System.arraycopy(children, 0, newArray, 0, children.length);
/*
* or this can be used:
* for(i=0;i<children.length;i++)
* children[i] = newArray[i];
*/
newArray[newArray.length-1] = x;
children = newArray;
}
当我在寻找答案时,我在另一个网站上发现了这个代码,所以我不确定它是否在这种情况下正常工作。提前谢谢!
答案 0 :(得分:0)
您无法修改基本数组的大小,因为它变为恒定分配的内存。你正在做的只是创建一个新数组,复制前一个数组的元素,然后传递引用。如果您无法使用ArrayLists或更高级的集合,则无法更改它。
答案 1 :(得分:0)
考虑到不能使用List
的约束,创建新数组和复制元素的方法是正确的,但是当前的方式并未优化。我建议你将数组大小增加一些因素,以避免在每次添加时都使用数组副本。
这是一个简单的实现,每次用完存储空间时,都会将数组大小增加一半。 size
告诉您当前“有效”元素的数量,以便实际数据数组从索引0
跨越到size-1
。
private int size = 0;
private int capacity = 10;
private Person[] children = new Person[capacity];
private static final float factor = 0.5f;
public void addChildren(Person x) {
if (size == capacity) {
capacity += (int) (capacity * factor);
Person[] newArray = new Person[capacity];
System.arraycopy(children, 0, newArray, 0, size);
children = newArray;
}
children[size++] = x;
}