在ArrayList<E>的学习中对于源码中的containAll()方法进行重新实现,
并且为了方便初学时理解没有采用源码中迭代器的实现方法。而是使用了更加方便理解的for循环。
下面是代码及思想:
1.首先是用一个object类数组保存制定集合,接着调用查找下标的方法判断首元素是否存在
Object[] array = list.toArray();
// 指定集合的首元素不存在
if (-1 == indexOf(array[0])) {
return false;
}
int index = indexOf(array[0]);
int first = 0;
2.首元素查找成功后记录下标值,然后进行整个指定集合的比对
for (int i = index; i < size; i++) {
// 记录每次指定集合首元素出现的位置
index = i;
// 比较指定集合所有元素都依次存在于原数组
while (elements[index++].equals(array[first++])){
if(first == array.length )
return true;
}
first = 0;
}
算法核心部分:
主要是first变量的使用,first++ 操作,
条件判断语句中它是下标值,进入while结构体中
它是已经比对的指定集合长度,
因此只要first等于指定集合就是比对成功
否则将first重置,
index也要重置,index = i + 1;
但是这里在index重新赋值时,我采用了在开始时记录比对开始
时原集合开始的位置,这样可以利用i++操作
以下是用到的成员方法 :
/**
* 查询指定元素在集合中的第一次出现下标位置
* @param obj 指定的元素
* @return 返回值大于等于0表示找到元素,否则返回-1
*/
public int indexOf(Object obj) {
int index = -1;
for (int i = 0; i < size; i++) {
// equals 判断对象是否一致地方的方法
if (obj.equals(elements[i])) {
index = i;
break;
}
}
return index;
}
代码中可能有的问题解释:
在代码 elements[index++].equals(array[first++] 如果
原数组的长度比指定数组短有没有可能出现数组越界问题?
因为在数组的扩容问题时会保证ArrayList数组容量是不满的以便
数据插入,这时出现不相等,直接跳出while循环。
以上就是我的containsAll()方法,虽然没有源码中迭代器简单但是更适合初学者理解。