上一节我们学习了如何往数据中添加元素,在此我们回顾一下,首先我们提供了add(int index,int e)方法,可以往数据中指定位置添加元素,那么在此之后的元素都得往后挪动一位,如果添加的元素位置就是size那么是不需要移动的。我们还具体讲解了add方法内部是如何实现的,有index的判断,防止index<0,index>size的情况;有size的判断,防止size==data.length的情况,当然也可以不用这么判断,后期我们将改为动态数组,这里我们还是使用这种实现方式。
上一小节中的add有一个for循环,这里有一个严重的问题就是边界的问题和从什么位置开始挪的问题,我们把问题贴出来
问题代码这里的问题是边界的问题,如果i<size-1将不会交换size-1位置上的元素,但是我们又担心size会超出data.length,其实上面我们已经判断了,不会出现这样的情况;第二个问题是,既然往后挪动,应该从后往前操作,现在我们的做法是从前往后挪,从前往后挪动的话首先需要有变量记录后一个元素的值,不然会被覆盖 。
从前往后挪动从前往后挪动是比较麻烦的,需要有变量记录后一个元素值,还有一种就是从后往前挪,就不需要有变量记录,非常的简单。
从后往前挪从后往前挪动就简单很多了,其他额外的操作,像上面的从前往后挪动应该也有优化的地方,但是总的来说,还是后面的操作简单,也容易符合人们的习惯。比如排队的时候,有一个插队了,那最后一个人不得往后退,才有空位可以插队
今天我们将学习数组中的删除元素,删除的方法有根据索引号来删除remove(int index)、根据元素值来删除removeElement(int e)、删除首位removeFirst()、删除末尾removeSecond(),具体实现下面我们会一一讲解到
我们先实现上一小节未实现的内容,获取私有的属性size和元素的容量,重构对象Array的toString()方法。
重构toString方法这里重构toString方法的目的是就是打印数组,在使用System.out.prinlt(arr)将调用对象的toString,也就是调用我们重构的toString方法。
现在实现移除元素的方法,但是对数组的容量我们并没有做任何的修改,后期将实现容量修改功能,下面我们来具体谈谈这个方法的实现。
移除方法remove首先是对索引index做判断,不能小于0 ,不能大于等于size。这里有点奇怪,和我们的add方法判断有点轻微的差别,我们具体来看下这种差别在什么地方,移除一个元素index不可以大于等于size,size指的是元素的个数,而元素的下标是从0开始的,所以最后一个元素的小标应该是size-1,所这里判断是index<0 || index>=size。
新增应该也是index<0 || index>=size,为什么我们将index>=size中的等号判断去掉了呢?因为一开始size是等于0的,添加第一个元素index也是等于0, 这样的话我们将不可以新增元素。其实后面的一个判断(size==data.length)也为我们避免出现data[size]的情况
其实有一个方法是可以完全避免出现这样的情况的,那就是我们的size表示的是现有元素的下标,而不是元素的个数,那么我们的判断可以这么写index>size,但是在程序的其他地方又会出现新的问题,这里我们不再深究。处理这样的问题就是把程序演练一遍,就可以预见可能的问题了
然后是把当前位置的数据记录下来,我们会返回删除的元素,并且从删除的位置开始往前挪动一位,把最后一位元素重置为0(data[size-1]=0),维护size的大小(size--),最后返回删除的元素。 重置最后一位元素的值为0是因为java初始化数组如果没有赋值,默认是0。
移除第一个或最后一个元素这里我们为数组中移除元素提供了两个便捷方法,移除首个元素removeFirst(),移除removeLast(),他们和addFirst(), addLast()有相同的作用
上面我们提供了通过索引号来移除元素,下面我们实现通过元素值来移除元素
通过元素值来移除removeElement(int e)方法调用了remove方法,后面我们将实现搜索和包含方法,会进一步的从重构removeElement方法
到此数组的删除方法就全部实现了,我们总结一下
删除方法
网友评论