44 容器(三)——ArrayList索引相关方法

方法都比较简单,这里列出来即可:

  • add(index,ele) //忘制定下标插入元素
  • add(ele) 
  • addAll(Collection <C> c) 泛型必须与调用add的泛型保持一致
  • set(index,ele)
  • remove(index)
  • remove(Object)
  • removeAll(Collection<C> c) 移除交集元素
  • get(index) 返回制定下标的元素
  • indexOf(Object o) 返回指定元素第一次出现所在的下标(正序)
  • lastIndexOf(Object o ) 返回指定元素第一次出现所在的下标(倒叙)
  • contains(Object) 是否包含某个元素
  • containsAll(Collection<C> c)是否包含某个集合
  • retainAll(Collection<C> c)保留两个集合的交集
  • toArray() 返回一个Object[]数组
  • clear() 清空集合

手写ArrayList

重点强调

  • ArrayList的底层是数组
  • 使用泛型
  • 删除元素的方法使用System.arraycopy()来覆盖原数组
package _20191209;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 手写ArrayList v1.0
 * 初始化、add、toString、get、remove方法
 * @author TEDU
 *
 */
public class MyArrayList<E> {
	//成员变量
	private Object[] datas;//底层数组
	private static final int DEFAULT_CAPACITY = 10;//初始容量
	private static int used = 0;//当前数组中已被填充的个数
	private static int size = DEFAULT_CAPACITY;//数组实际大小
	//初始化
	public MyArrayList() {
		datas = new Object[DEFAULT_CAPACITY];
	}
	public MyArrayList(int size) {//自定义容器大小
		this.size = size;
		datas = new Object[size];
	}
	//、add
	public void add(E e) {
		if(used < size) {
			datas[used++] = e;
		}else {
			size += (size>>1);
			datas = Arrays.copyOf(datas,size);
		}
	}
	//、toString
	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("[");
//		for(Object o : datas) {
//			sb.append(o+",");
//		}
		for (int i = 0; i < used; i++) {
			if(i!=used-1) {
				sb.append(datas[i]+",");
			}else {
			sb.append(datas[i]);
			}
		}
		sb.append("]");
		return sb.toString();
	}
	
	
	
	//、get
	public E get(int index) {
		return (E) datas[index];
	}
	
	//set
	public boolean set(int index,E element) {
		if(index >= used) {
			return false;
		}
		datas[index] = element;
		return true;
	}
	
	//、remove方法,移除后used要减一
	public boolean remove(int index) {
		if(index >= used) {
			return false;
		}
		//使用arrycopy很方便
		System.arraycopy(datas, index+1, datas, index, (used--)-index);
		return true;
	}
	public boolean remove(E element) {
		for (int i = 0; i < used; i++) {
				if(((E)datas[i]).equals(element)) {
				remove(i);
				return true;
			}
		}
		return false;
	}
	
	//indexOf 返回第一个匹配的元素所在下标,如元素不存在返回-1
	public int indexOf(E element) {
		for (int i = 0; i < used; i++) {
			if(((E)datas[i]).equals(element)) {
				return i;
			}
		}
		return -1;
		
	}
	
	//lastIndexOf
	public int lastIndexOf(E element) {
		for (int i = used-1; i >= 0; i--) {
			if(((E)datas[i]).equals(element)) {
				return i;
			}
		}
		return -1;
	}
	
	//size返回集合大小
	public int size() {
		return used;
	}
	
	//clear 清空集合
	public void clear() {
		datas = new Object[DEFAULT_CAPACITY];
		used = 0;
	}
	
	
	
	//测试
	public static void main(String[] args) {
		MyArrayList<Integer> ml = new MyArrayList<>();
//		Scanner scan = new Scanner(System.in);
//		String str = "";
//		while(!str.contentEquals("-1")) {//输出-1推出循环
//			System.out.println("请添加:");
//			str = scan.nextLine();
//			if(str.contentEquals("-1")) return;
//			ml.add(str);
//			System.out.println(ml);;
//		}
		//手写版ArrayList
		System.out.println("----------手写版ArrayList---------------");
		ml.add(123);
		ml.add(12);
		System.out.println(ml);
		System.out.println(ml.size());
		ml.set(1, 33);
		System.out.println(ml);
		ml.remove(1);
		System.out.println(ml);
		ml.add(66);
		ml.add(13);
		System.out.println(ml);
		ml.remove((Integer)66);//直接输入66会被认为是下标66的元素
		System.out.println(ml);
		System.out.println(ml.indexOf((Integer)123));
		ml.add(123);
		System.out.println(ml.lastIndexOf((Integer)123));
		ml.clear();
		System.out.println(ml);
		System.out.println(ml.size());
		
		//正版ArrayList测试
		System.out.println("---------------以下为正版ArrayList-----------------");
		List<Integer> arrayList = new ArrayList<>();
		arrayList.add(123);
		arrayList.add(12);
		System.out.println(arrayList);
		System.out.println(arrayList.size());
		arrayList.set(1, 33);
		System.out.println(arrayList);
		arrayList.remove(1);
		System.out.println(arrayList);
		arrayList.add(66);
		arrayList.add(13);
		System.out.println(arrayList);
		arrayList.remove((Integer)66);//直接输入66会被认为是下标66的元素
		System.out.println(arrayList);
		System.out.println(arrayList.indexOf((Integer)123));
		arrayList.add(123);
		System.out.println(arrayList.lastIndexOf((Integer)123));
		arrayList.clear();
		System.out.println(arrayList);
		System.out.println(arrayList.size());
		
	}
}

  

  

posted @ 2019-12-09 19:45  Scorpicat  阅读(556)  评论(0编辑  收藏  举报