자료구조

ArrayList

제주도소년 2020. 2. 13. 16:35
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