728x90
ArrayList를 직접 코드를 구현하여 int 형 ArrayList를 나타내 보고자 한다.
✨ Constructor & Basic Attribute
private int[] elementData; // 값 넣을 곳
private int size; // arraylist size
private int currentCapacity; // 현재 arraylist 크기
private int initCapacity = 10; // 최초 arraylist 크기
//constructor
public MyArrayList() {
this.elementData = new int[initCapacity];
this.size = 0;
this.currentCapacity = initCapacity;
}
값 넣을 elementData를 최초로는 10의 값을 넣어주고, size는 0, 현재 arraylist size(currentCapacity)는 최초 arraylist 크기로 초기화 시킨다.
✨ add
1. addFrist (int data)
2. addLast (int data)
3. add(int index, int data)
public boolean addFirst(int data) {
return add(0, data);
}
public boolean addLast(int data) {
changeCapacity();
elementData[size]= data;
size++;
return true;
}
public boolean add(int index, int data) {
changeCapacity();
for (int i = size - 1; i >= index; i--) {
elementData[i + 1] = elementData[i];
}
elementData[index] = data;
size++;
return true;
}
//refactoring
private void changeCapacity() {
if(size == currentCapacity) {
int[] newArray = new int[currentCapacity*2];
for(int i = 0; i < size ; i++) {
newArray[i] = elementData[i];
}
elementData = newArray;
currentCapacity = currentCapacity * 2;
}
}
- changeCapacity 함수는 현재 size가 배열의 최대 크기와 같다면 (앞으로 데이터를 넣으면 에러가 뜬다면) 배열의 크기를 두배로 만들어준다.
- add(int index, int data)는 elementData size에 (현재 최대 index + 1) 앞 index 데이터를 당겨서 값을 넣어주고, 마지막에 원하는 위치에 데이터 값을 넣어준다. (마지막 배열 index + 1 부터 내려가는 식으로 for문을 작성해야 한다.)
- add 에서는 parameter index가 0일 때, index -1을 하면 음수가 되어 에러가 날 수 있기 때문에 i를 size -1로 하고 넣어야 하는 값을 i+1을 한다.
- addFirst(int data)는 add(int index, int data)를 재사용하여 값을 넣어준다.
- addLast(int data)는 배열 마지막에 넣어주는 함수이다.
✨ toString
실제 객체 값에 들어 있는 값을 출력하기 위해서는 이 함수를 사용해야 한다.
즉, 객체를 문자로 출력할 때 필요한 함수이다.
public String toString() {
String str = "[";
for (int i = 0; i < size; i++) {
str += elementData[i];
if (i < size - 1) {
str += ", ";
}
}
return str + "]";
}
✨ remove
1. remove (int index)
2. removeFirst()
3. removeLast()
public int remove(int index) {
int removed = elementData[index]; // removed value return
for(int i = index+1; i<size; i++) {
elementData[i-1] = elementData[i];
}
elementData[size-1] = 0; // last size data default 0
size --;
return removed;
}
public int removeFirst() {
return remove(0);
}
public int removeLast() {
return remove(size-1);
}
- 빈 공간이 생기면 앞으로 전진 배치를 하기 위해 index부터 size -1 까지 값을 넣어주는 for문을 시행해야 한다.
✨ get
public int get(int index) {
return elementData[index];
}
- 배열에 index로 접근한다는 장점에서 linkedList보다 훨씬 더 빨리 데이터 제공이 가능하다.
- 어느 위치에 있던 간에 동일한 시간에 데이터를 가져올 수 있음.
✨ size, indexOf
public int size() {
return size;
}
public int indexOf(int data) {
for(int i =0; i<size; i++) {
if(elementData[i] == data) {
return i;
}
}
return -1;
}
- size(): List의 size
- indexOf(int data): data가 들어 있는 index의 값
✨ iterator next, hasNext, previous, hasPrevious
for(int i =0; i<numbers.size(); i++) {
System.out.println(numbers.get(i));
}
이렇게 반복적으로 사용되는 구문은 while과 for를 통해 사용할 수 있지만, iterator를 사용하는 것이 더 좋다.
// main.class
MyArrayList.MyListIterator li = numbers.listIterator();
while(li.hasNext()) {
System.out.println(li.next());
}
while(li.hasPrevious()) {
System.out.println(li.previous());
}
//MyArrayList.class
//ListIterator 객체 생성
public MyListIterator listIterator() {
return new MyListIterator();
}
class MyListIterator {
private int nextIndex = 0;
public int next() {
// int returnData = elementData[nextIndex];
// nextIndex++;
// return returnData;
return elementData[nextIndex++];
}
public boolean hasNext() {
return nextIndex < size();
}
public int previous() {
return elementData[--nextIndex];
}
public boolean hasPrevious() {
return nextIndex > 0;
}
}
✨ iterator add, remove
//Main.class
while(li.hasNext()) {
int number = li.next();
if(number == 30) {
li.remove(); // or li.add(int data);
}
System.out.println(number);
}
System.out.println(numbers);
//MyArrayList.MyListIterator.class
public void add(int data) {
MyArrayList.this.add(nextIndex++, data);
}
// 최소한 next(); 한번 호츨 후 remove 실행
public void remove() {
MyArrayList.this.remove(nextIndex-1);
// next() 수행하면 nextIndex 값 1개 plus 되므로 그 전의 값을 얻기 위해 -1 해주기
nextIndex--;
}
728x90
'PS > Data Structure' 카테고리의 다른 글
LinkedList 구현 방법 (MyLinkedList) (0) | 2022.04.10 |
---|---|
[개념] LinkedList (0) | 2022.04.10 |
[개념] ArrayList, 사용법(create, insert, remove, get, size, indexof, iterator) (0) | 2022.04.09 |
[개념] Array vs List, List (0) | 2022.04.09 |
[개념] 데이터 구조 (Data Structure), Array (0) | 2022.04.09 |