我的
package day309;
import java.util.Arrays;
import java.util.NoSuchElementException;
public class MyList<E> implements MyListInterface<E> {
private final int MAX_CAPACITY = Integer.MAX_VALUE - 8;
private Object[] arrs;
private int size;
public int getSize() {
return size;
}
public int getLength() {
return arrs.length;
}
@Override
public String toString() {
return "MyList{" +
"arrs=" + Arrays.toString(arrs) +
'}';
}
public MyList(int initCapacity) {
if (initCapacity <= 0 || initCapacity > MAX_CAPACITY) {
throw new IllegalArgumentException("initCapacity = " + initCapacity);
}
this.arrs = new Object[initCapacity];
}
@Override
public boolean add(E o) {
if (o == null) {
throw new IllegalArgumentException("parame is null");
}
if (size == arrs.length) {
int newLen = getLen();
grow(newLen);
}
arrs[size] = o;
size++;
return true;
}
private void grow(int newLen) {
Object[] objects = new Object[newLen];
for (int i = 0; i < arrs.length; i++) {
objects[i] = arrs[i];
}
arrs = objects;
}
private int getLen() {
int oldLen = arrs.length;
int newLen = oldLen << 1;
if (newLen < 0 || newLen > MAX_CAPACITY) {
newLen = MAX_CAPACITY;
}
if (oldLen == newLen) {
throw new RuntimeException("arrs is max");
}
return newLen;
}
@Override
public void add(int index, Object element) {
if (size == arrs.length) {
int newLen = getLen();
grow(newLen);
}
System.arraycopy(arrs, index, arrs, index + 1, size - index);
arrs[index] = element;
size++;
}
@Override
public void clear() {
for (int i = 0; i < size; i++) {
arrs[i] = null;
}
size = 0;
}
@Override
public boolean contains(Object o) {
if (o == null) {
for (int i = 0; i < size; i++) {
if (arrs[i] == null) return true;
}
} else {
for (int i = 0; i < size; i++) {
if (o.equals(arrs[i])) return true;
}
}
return false;
}
@Override
public E get(int index) {
if (index > size || index < 0) {
System.out.println("-1");
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
return (E) arrs[index];
}
@Override
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++) {
if (arrs[i] == null) return i;
}
} else {
for (int i = 0; i < size; i++) {
if (o.equals(arrs[i])) return i;
}
}
return -1;
}
@Override
public int lastIndexOf(Object o) {
if (o == null) {
for (int i = size - 1; i > 0; i--) {
if (arrs[i] == null) {
return i;
}
}
} else {
for (int i = size - 1; i > 0; i--) {
if (o.equals(arrs[i])) {
return i;
}
}
}
return -1;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public E remove(int index) {
if (index > size || index < 0) {
System.out.println("-1");
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
E oldValue = (E) arrs[index];
int numMoved = size - 1 - index;
if (numMoved > 0)
System.arraycopy(arrs, index + 1, arrs, index, numMoved);
arrs[size - 1] = null;
return oldValue;
}
@Override
public boolean remove(Object str) {
if (str == null) {
for (int index = 0; index < size; index++) {
if (size - index - 1 > 0) {
return remove2(index);
}
}
} else {
for (int i = 0; i < size; i++) {
if (str.equals(arrs[i])) {
return remove2(i);
}
}
}
return false;
}
private boolean remove2(int i) {
System.arraycopy(arrs, i + 1, arrs, i, size - i - 1);
arrs[--size] = null;
return true;
}
@Override
public Object set(int index, Object element) {
if (index > size || index < 0) {
System.out.println("-1");
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
arrs[index] = element;
return null;
}
@Override
public int size() {
return getSize();
}
@Override
public MyIterator iterator() {
return new Itr(0);
}
class Itr implements MyIterator<E> {
int cursor;
int lastRet = -1;
public Itr(int index) {
this.cursor = index;
}
@Override
public boolean hasNext() {
return cursor < size;
}
@Override
public E next() {
lastRet = cursor;
cursor = cursor + 1;
return (E) arrs[lastRet];
}
@Override
public boolean hasPrevious() {
return cursor != 0;
}
@Override
public E previous() {
if (!hasPrevious()) {
throw new NoSuchElementException();
}
lastRet = --cursor;
return (E) arrs[lastRet];
}
@Override
public int nextIndex() {
return cursor;
}
@Override
public int previousIndex() {
return cursor - 1;
}
@Override
public void add(E e) {
MyList.this.add(cursor, 0);
cursor++;
lastRet = -1;
}
@Override
public void remove() {
MyList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
}
@Override
public void set(E e) {
arrs[lastRet] = e;
}
}
@Override
public MyIterator iterator(int index) {
return new Itr(index);
}
}
参考
package day309.Demo;
import java.util.ConcurrentModificationException;
import java.util.NoSuchElementException;
public class MyArrayList<E> implements MyListInterface<E> {
private static final int DEFAULT_CAPACITY = 10;
private static final int MAX_CAPACITY = Integer.MAX_VALUE - 8;
private Object[] elements;
private int size;
private int modCount;
public MyArrayList() {
elements = new Object[DEFAULT_CAPACITY];
}
public MyArrayList(int initialCapacity) {
if (initialCapacity <= 0 || initialCapacity > MAX_CAPACITY) {
throw new IllegalArgumentException("initialCapacity=" + initialCapacity);
}
elements = new Object[initialCapacity];
}
@Override
public boolean add(E e) {
int oldSize = size;
add(size, e);
return oldSize < size;
}
@Override
public void add(int index, E e) {
checkIndexForAdd(index);
if (size == elements.length) {
int minCapacity = size + 1;
int newLength = calculateCapacity(minCapacity);
grow(newLength);
}
for (int i = size; i > index; i--) {
elements[i] = elements[i - 1];
}
elements[index] = e;
size++;
modCount++;
}
@Override
public void clear() {
for (int i = 0; i < size; i++) {
elements[i] = null;
}
size = 0;
modCount++;
}
@Override
public boolean contains(E e) {
return indexOf(e) != -1;
}
@Override
public E get(int index) {
checkIndex(index);
return (E) elements[index];
}
private void checkIndex(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("index=" + index + ", size=" + size);
}
}
@Override
public int indexOf(E e) {
if (e == null) {
for (int i = 0; i < size; i++) {
if (elements[i] == null) return i;
}
} else {
for (int i = 0; i < size; i++) {
if (e.equals(elements[i])) return i;
}
}
return -1;
}
@Override
public int lastIndexOf(E e) {
if (e == null) {
for (int i = size - 1; i >= 0; i--) {
if (elements[i] == null) return i;
}
} else {
for (int i = size - 1; i >= 0; i--) {
if (e.equals(elements[i])) return i;
}
}
return -1;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public E remove(int index) {
checkIndex(index);
E removeValue = (E) elements[index];
for (int i = index; i < size - 1; i++) {
elements[i] = elements[i + 1];
}
elements[size - 1] = null;
size--;
modCount++;
return removeValue;
}
@Override
public boolean remove(E e) {
int index = indexOf(e);
if (index == -1) return false;
remove(index);
return true;
}
@Override
public E set(int index, E e) {
checkIndex(index);
E oldValue = (E) elements[index];
elements[index] = e;
return oldValue;
}
@Override
public int size() {
return size;
}
@Override
public MyIterator<E> iterator() {
return new Itr(0);
}
@Override
public MyIterator<E> iterator(int index) {
checkIndexForAdd(index);
return new Itr(index);
}
private class Itr implements MyIterator<E> {
int cursor;
int expModCount = modCount;
int lastRet = -1;
Itr(int index) {
cursor = index;
}
@Override
public boolean hasNext() {
return cursor != size;
}
@Override
public E next() {
checkConModException();
if (!hasNext()) {
throw new NoSuchElementException();
}
lastRet = cursor;
cursor++;
return (E) elements[lastRet];
}
private void checkConModException() {
if (expModCount != modCount) {
throw new ConcurrentModificationException();
}
}
@Override
public boolean hasPrevious() {
return cursor != 0;
}
@Override
public E previous() {
checkConModException();
if (!hasPrevious()) {
throw new NoSuchElementException();
}
lastRet = --cursor;
return (E) elements[lastRet];
}
@Override
public int nextIndex() {
return cursor;
}
@Override
public int previousIndex() {
return cursor - 1;
}
@Override
public void add(E e) {
checkConModException();
MyArrayList.this.add(cursor, e);
expModCount = modCount;
cursor++;
lastRet = -1;
}
@Override
public void remove() {
checkConModException();
if (lastRet == -1) {
throw new IllegalStateException();
}
MyArrayList.this.remove(lastRet);
expModCount = modCount;
cursor = lastRet;
lastRet = -1;
}
@Override
public void set(E e) {
checkConModException();
if (lastRet == -1) {
throw new IllegalStateException();
}
elements[lastRet] = e;
}
}
private void grow(int newLength) {
Object[] newTable = new Object[newLength];
for (int i = 0; i < size; i++) {
newTable[i] = elements[i];
}
elements = newTable;
}
private int calculateCapacity(int minCapacity) {
if (minCapacity > MAX_CAPACITY || minCapacity < 0) {
throw new IllegalArgumentException();
}
int newLength = elements.length + (elements.length >> 1);
if (newLength > MAX_CAPACITY || newLength < 0) {
newLength = MAX_CAPACITY;
}
return newLength > minCapacity ? newLength : minCapacity;
}
private void checkIndexForAdd(int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("index=" + index + ", size=" + size);
}
}
}