问题的方向来源于LinkedList中这3个方法的实现,如果将i看成是下标,,,就悲剧了。因为链式存储里面没有下标的概念。
尽管jdk中的实现,将List从0开始。
但是,把下标的概念引入List中,只能是将第一个元素看成是第0个。
然而我总觉得怪怪的,所以就跑开下标的概念。就是用第几个元素的概念。自己写代码怎么定义都行O(∩_∩)O哈!
这3个方法的定义在List中是这样定义的:
public void delete(int i);
public void update(int i, T dest);
public T search(int i);
当时将参数里面的i理解为数组的下标,这样就太局限了。接口而言不应该考虑实现机制。
正常的思路应该是:
删除第i个元素
更新第i个元素
查找第i个元素
这个i本应该指列表的元素的实际顺序,从1开始。
所以,ArrayList中的3个实现都应该修正:下面是修正后的方法
@Override
public void delete(int i) {
if(i<1 || i>size)
try {
throw new Exception(i+" iserror!");
} catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
if(i==size){
//如果是最后一个元素。不用移动元素。给它null。size--
container[i-1]=null;
size--;
}else
{
//怎么删除呢,每个人都知道了。后面的依次往前移动就OK了。
for(int j=i;j<=size-1;j++){
container[j-1]=container[j];
}
//同样,以上移动完成后,最后一个元素就多余了。给它Null
container[size-1]=null;
size--;
}
}
@Override
public void update(int i, T dest) {
//还是先判断异常情况
if(i<1 || i>(size))
try {
throw new Exception(i+" iserror!");
} catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
//安心的更新
container[i-1] = dest;
}
@Override
public T search(int i) {
//还是先判断异常情况
if(i<1 || i>(size))
try {
throw new Exception(i+" iserror!");
} catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
//放心的返回
return container[i-1];
}