ArrayList中containsAll方法的非源码迭代器实现,更适合初学者理解的思路

在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()方法,虽然没有源码中迭代器简单但是更适合初学者理解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值