public class MyArrayList<T> {
private static final int INIT_CAPACITY = 10;
private T[] theData;
private int size;
private int capacity;
public MyArrayList() {
// Type casting
theData = (T[]) new Object[INIT_CAPACITY];
size = 0;
capacity = INIT_CAPACITY;
}
public void add(T anEntry) {
add(size, anEntry);
}
public void add(int index, T anEntry) {
// index 범위를 벗어났을 때
if (index < 0 || index > size) // exception
throw new ArrayIndexOutOfBoundsException(index);
// 배열의 공간이 가득찼을 때 더블링(배열 크기를 2배 늘림)
if (size >= capacity)
reallocate();
// 데이터를 추가하고 사이즈를 1증가
for (int i = size; i >= index; i--)
theData[i + 1] = theData[i];
theData[index] = anEntry;
size++;
}
// 배열의 크기를 2배 늘리는 작업
private void reallocate() {
capacity *= 2;
theData = Arrays.copyOf(theData, capacity);
}
public int size() {
return size;
}
// 배열 안에 anEntry 값이 존재하는지 검사
public int indexOf(T anEntry) {
for (int i = 0; i < size; i++)
if (theData[i].equals(anEntry))
return i;
return -1;
}
// index 번째 값을 가져온다.
public T get(int index) {
if (index < 0 || index > size) { // exception
throw new ArrayIndexOutOfBoundsException(index);
}
return theData[index];
}
public T set(int index, T newValue) {
if (index < 0 || index >= size) {
throw new ArrayIndexOutOfBoundsException(index);
}
T oldValue = theData[index];
theData[index] = newValue;
return oldValue;
}
public T remove(int index) {
if (index < 0 || index >= size) {
throw new ArrayIndexOutOfBoundsException(index);
}
T returnValue = theData[index];
for (int i = index + 1; i < size; i++) {
theData[i - 1] = theData[i];
}
size--;
return returnValue;
}
}
출처는 권오흠 교수님의 강의
'자료구조' 카테고리의 다른 글
정적바인딩 원형 큐(Circulation Queue) (0) | 2020.02.18 |
---|---|
Stack (노드 개념 적용) (0) | 2020.02.18 |
연결리스트(Linked List) (0) | 2020.02.13 |
리스트 (LIST) (0) | 2020.02.13 |
자료구조와 알고리즘 (0) | 2020.01.15 |