我只是在学习如何处理类和对象,并正在编写不同的方法来处理我创建的Vector类。
我已经编写了两种添加和插入元素的工作方法,现在正试图在一种新方法中使用其中任何一种,其目的是创建一个新的Vector子向量对象,该对象只包含从索引a到索引b-1的元素,但具有与原始对象相同的容量。
我尝试过同时使用insert和add方法,insert方法似乎过早地打断了循环,只返回了第一个元素,add方法几乎返回了正确的结果,但用零替换了最后一个元素。
我的第一种方法是像处理数组一样复制和插入元素,但这会返回相同的结果。为什么我的代码返回这样的结果?
(英语不是我的第一语言,所以大多数名字都是斯洛文尼亚语,为了清晰起见,最重要的名字都被翻译了(
这就是类的样子:
public class VektorInt{
private int[] elementi;
private int stElementov;
private static final int START_CAPACITY = 10;
//konstanta, lahko jo večkrat uporabimo
public VektorInt(int startCapacity){
this.elementi = new int[startCapacity];
this.stElementov = 0;
}
public VektorInt() {
this(START_CAPACITY);
}
这些是用来操纵物体的方法:
public void set(int index, int value){
if(index > this.elementi.length){
throw new IndexOutOfBoundsException
}
this.elementi[index] = value;
}
public void add(int value){
this.expandIfNeeded();
this.elementi[this.stElementov] = value;
this.stElementov++;
}
private void expandIfNeeded(){
if (this.stElementov >= this.elementi.length){
int[] stariElementi = this.elementi;
this.elementi = new int[2*stariElementi.length];
for(int i = 0; i < this.stElementov; i++){
this.elementi[i] = stariElementi[i];
}
}
}
public void insert(int index, int value){
this.expandIfNeeded();
for(int i = this.stElementov - 1; i >= index; i--){
this.elementi[i + 1] = this.elementi[i];
}
this.elementi[index] = value;
this.stElementov++;
}
这就是有问题的方法:
public VektorInt subvector(int start, int end){
VektorInt subvector = new VektorInt(this.elementi.length);
for(int i = start; i <= (end) - 1; i++){
subvector.add(elementi[i])
}
subvector.stElementov++;
return subvector;
}
其对于System.out.println(vektorsubvector(0,6((返回[2,3,4,5,6,1,0]。
如果我将subvector.add(elementi[I](交换为subvector.insert(elementi[I](,那么子向量方法在第一个元素之后停止的原因是什么?如果我用足够大的启动容量初始化一个向量,这不应该也起作用吗?
使用subvector.add(elementi[i]);
将元素添加到subvector
会正确更改子向量stElementov
。
之后,您编写subvector.stElementov++;
,它增加了subvector
的大小,而实际上没有添加元素。
这意味着subvector
的实际大小现在比添加的元素数量大一个。
对于这个额外的元素,值是int[]
中的默认值——恰好是零(0(。这是您在打印subvector
时看到的额外零。