不整那些没用的,直接进入主题.
首先我们要搞明白顺序表是由什么来实现的,答案是数组.搞清楚了这个就可以继续下去了.
要实现的方法
// 打印顺序表
public void display() { }
// 新增元素,默认在数组最后新增
public void add(int data) { }
// 在 pos 位置新增元素
public void add(int pos, int data) { }
// 判定是否包含某个元素
public boolean contains(int toFind) { return true; }
// 查找某个元素对应的位置
public int indexOf(int toFind) { return -1; }
// 获取 pos 位置的元素
public int get(int pos) { return -1; }
// 给 pos 位置的元素设为 value
public void set(int pos, int value) { }
//删除第一次出现的关键字key
public void remove(int toRemove) { }
// 获取顺序表长度
public int size() { return 0; }
// 清空顺序表
public void clear() { }
我们要实现上面的方法之前要创建几个变量.
-
DEFAULT_SIZE(默认长度)
-
usedSize(数组的有效长度)
- elem(数组)
首先写一下构造方法
public arrayListTwo(){
this.elem = new int[DEFAULT_SIZE];
}
在创建arrayListTwo这个类的时候就给elem数组初始化. 接下来登场的是第一个方法.
打印顺序表.
public void display() {
for (int i = 0; i < this.usedSize; i++) {
System.out.print(this.elem[i] + " ");
}
System.out.println();
}
非常的简单哈,就是一个简单的for循环,实在不清楚,就讲一讲吧.
变量 i 从0下标开始,到 i < usedSize结束,进入一次for循环打印一次,周而复始直到 i >= usedSize为止.
新增元素.
public void add(int data) throws EmptyException {
if(isFull()){
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
}
//要不要判断数组是否为空?在构造方法的时候数组就已经初始化了
//所以不存在数组是空的情况.
// if(isEmpty()){
// throw new EmptyException("数组为空");
// }
this.elem[this.usedSize] = data;
this.usedSize++;
}
在数据结构中,每写一行代码都要十分的谨慎,假如就写最后两行代码就行了,那就少考虑了,当数组满的情况就没有额外的位置来存放元素, 所以要判断数组是否满了,满了就扩容.
到了这里就会有人会问了,数组会不会为null? 答案是不会的,在new 对象的时候,就已经通过构造方法初始化了数组,这样就不会在访问数组元素的时候报错了.
接下来上强度了,在指定的位置插入元素.
新增元素Pro版
public void add(int pos, int data) throws InputException{
if(isFull()){
this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
}
if(pos < 0 || pos > this.usedSize){
throw new InputException("输入的位置非法");
}
for (int i = this.usedSize - 1; i >= pos; i--) {
this.elem[i + 1] = this.elem[i];
}
this.elem[pos] = data;
this.usedSize++;
}
拿到方法不要急着去写代码,先考虑元素能不能放,放哪里的问题,再来写代码.
首先老样子先判断是否满了,满了就扩容.之后就是判断pos位置是否非法.
第二个if中的条件可能有些看不懂哈,这里解释一下. 前面一个条件很好理解,你插入的位置是负数,肯定是不行的, 其次就是后一个条件, 注意注意: 在数据结构中,是不能隔着位置插入的.
因此 pos > usedSize. pos等于usedSize是可以的.
后面的for循环思路如下动态图.
pos下标的元素空出来了之后就可以将元素插入了.
判断是否包含某个元素
public boolean contains(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if(this.elem[i] == toFind){
return true;
}
}
return false;
}
这个方法很简单哈,就是一个简单的for循环. 条件核心是usedSize.
查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if(this.elem[i] == toFind){
return i;
}
}
return -1;
}
这个方法也是简单的一个for循环就搞定了,需要注意的是,当比较的数据是引用型数据时,要用equals来比较.
获取pos位置的元素
public int get(int pos) throws EmptyException, InputException{
if(isEmpty()){
throw new EmptyException("数组中没有元素");
}
if(pos < 0 || pos >= this.usedSize){
throw new InputException("pos位置非法");
}
return this.elem[pos];
}
这里需要注意的点就是,第一个if条件判断是否为空,指的是数组中是否有元素,而不是指数组是否为null. pos >= usedSize 条件指的是数组越界.
给pos位置的元素设置为value
public void set(int pos, int value) throws EmptyException, InputException {
if(isEmpty()){
throw new EmptyException("数组中没有元素");
}
if(pos < 0 || pos >= this.usedSize){
throw new InputException("pos位置非法");
}
this.elem[pos] = value;
}
这里同理也要判断数组是否为空.因为数组为空的时候没有元素给你修改.同样也要判断pos的位置是否非法.
删除第一次出现的关键字key
public void remove(int toRemove) throws EmptyException{
if(isEmpty()){
throw new EmptyException("数组为空");
}
int index = indexOf(toRemove);
if(index == -1){
return;
}
for(int i = index; i < this.usedSize; i++){
this.elem[i] = this.elem[i + 1];
}
this.usedSize--;
}
再删除元素的时候要考虑几个问题.
1.数组是否为空,一个空数组,没有元素可以删除.
2.先找到关键字的位置才能进行下一步吧.
for循环同样也有动态图来解释,更直观一点.
结尾
好啦,以上就是全部内容啦, 要是对你有帮助的话,可以给一个免费的赞.