package Study.Collection;
/**
* <p>Description: </p>
* 增加remove方法
* @author zhangyan
* @date 2018/12/19 14:19
*/
public class YanArrayList04<E> {
private Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10;
public YanArrayList04() {
elementData = new Object[DEFALT_CAPACITY];
}
public YanArrayList04(int capacity) {
if (capacity < 0) {
throw new RuntimeException("容器的容量不能为负数");
} else if (capacity == 0) {
elementData = new Object[DEFALT_CAPACITY];
} else {
elementData = new Object[capacity];
}
}
//size方法
public int size() {
return size;
}
//isEmpty方法
public boolean isEmpty() {
return size == 0 ? true : false;
}
public void add(E element) {
if (size == elementData.length) {
Object[] newArray = new Object[elementData.length + (elementData.length >> 1)]; //10-->10+10/2
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++] = element;
}
public E get(int index) {
checkRange(index);
return (E) elementData[index];
}
public void set(E element, int index) {
checkRange(index);
elementData[index] = element;
}
public void checkRange(int index) {
if (index < 0 || index > size - 1) {
throw new RuntimeException("索引不合法:" + index);
}
}
public void remove(E element) {
//element,将它和所有元素挨个比较,获得第一个比较为true的,返回。
for (int i = 0; i < size; i++) {
if (element.equals(get(i))) { //容器中所有的比较操作,都是用的equals而不是==
//将该元素从此处移除
remove(i);
}
}
}
//带参数的移除,用于调用
public void remove(int index) {
//a,b,c,d,e,f,g,h变成a,b,c,e,f,g,h
//删除实际上是copy操作
int numMoved = elementData.length - index - 1;
if (numMoved > 0) {
//从index+1开始拷贝,到index的位置,拷贝的数据时numMoved个,想当如把index之后的数都前移一位
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null;
}
public String toString() {
StringBuilder sb = new StringBuilder();
//[a,b,c]
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elementData[i] + ",");
}
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
//测试
public static void main(String[] args) {
YanArrayList04 s1 = new YanArrayList04();
for (int i = 0; i < 40; i++) {
s1.add("baba" + i);
}
s1.remove("baba3");
System.out.println(s1);
System.out.println(s1.size);
System.out.println("########################");
s1.remove(4);
System.out.println(s1);
System.out.println(s1.size);
//判断是否为空
System.out.println(s1.isEmpty());
}
}
解析:
移除操作和扩容的思想差不多,都是数组的拷贝。
思想是:
- 1,找到需要移除的值对应的索引;
- 2,根据这个索引来确定数组拷贝的范围。
具体参照详细代码