티스토리 뷰
1. ArrayList 기능구현
1.1 remove(index)
- remove(int index) : 삭제하고자하는 index에있는 요소를 삭제하고 해당 index의 element를 리턴함
public Object remove(int index) {
Object removed = elementData[index];
for (int i = index; i < size-1; i++) {
elementData[i] = elementData[i+1];
}
elementData[size-1] = null;
size--;
return removed;
}
1.2 removeFirst(), removeLast()
public Object removeFirst() {
return remove(0); //return이 remove(0)의 내부까지 return 한다고 복잡하게 생각하지말고, 그냥 remove(0)을 실행시킨다고 생각해라.
}
public Object removeLast() {
return remove(size-1);
}
1.3 get(index)
- ArrayList의 장점: 내부적으로 배열을 사용기 때문에 배열에 index값을 주어 특정한 element를 바로 가져올 수 있다.
public Object get(int index) {
return elementData[index];
}
1.4 size()
- 변수 size를 직접 접근하지 않고 메서드를 통해 접근하는 이유는 외부에서 size를 함부로 수정할 수 없게 하기 위해서임 (size는 private로 선언돼 있음)
public int size() {
return size;
}
1.5 indexOf(element)
- equals() : The java string equals() method compares the two given strings based on the content of the string. If any character is not matched, it returns false. If all characters are matched, it returns true.
The String equals() method overrides the equals() method of Object class.
- 입력한 element의 index값을 반환하는 함수
public int indexOf(Object element){
for (int i = 0; i <= size-1; i++) {
if (element.equals(elementData[i])) {
return i;
}
}
return -1;
}
1.6 iterator
- 반복적인 작업을 처리하기 위해 고안된 객체
- ArrayList.ListIterator li = numbers.listIterator(); : listIterator()는 어떤 객체(new ListIterator())를 리턴하고 그 데이터를 li변수에 담음, li변수의 데이터타입은 numbers의 클래스인 ArrayList안에의 또다른 클래스인 ListIterator.
(결과적으로, ListIterator li = new ListIterator()라는 ListIterator클래스의 인스턴스 생성과 같은 코드가 됨)
- 즉 ArrayList객체 numbers의 반복적인 작업을 처리하기 위해서는 ListIterator라는 객체가 필요한데, 그 객체를 리턴받기 위해서 listIterator()라는 메서드를 사용
- 왜 이런방식으로 하나? (가설1. numbers.listIterator()을 통해 ListIterator의 인스턴스를 만들면 변수 li에 number의 정보가 담겨 numbers의 element를 사용할 수 있기 때문에)
ArrayList.ListIterator li = numbers.listIterator();
//ArrayList에 정의 된 listIterator() 함수
public ListIterator listIterator() {
return new ListIterator();
}
L
//ArrayList에 정의된 ListIterator클래스
class ListIterator{
private int nextIndex = 0;
public Object next() {
return elementData[nextIndex++];
// Object returnData = elementData[nextIndex];
// nextIndex++;
// return returnData;
}
public boolean hasNext() {
return nextIndex < size();
}
}
}
//실제 반복 수행
ArrayList.ListIterator li = numbers.listIterator();
while (li.hasNext()) {
System.out.println(li.next());
}
1.7 next()
- next를 처음 호출하게 되면, 첫번째 엘리먼트를 리턴함. 다시 호출하면 다음 엘리먼트를 리턴 - > 반복.
- 특정한 인덱스를 어떻게 결정하는가? next()가 호출될때마다 elementData[nextIndex]에서 nextindex가 지정하는 값을 return하고, nextIndex값이 0부터 시작해서 1씩 증가하게 된다면 elementData[]에 담겨있는 값들을 next()가 호출할 때마다 순차적으로 하나씩 꺼내서 리턴할 수 있음. (출력하고 증가시킨다)
class ListIterator{
private int nextIndex = 0;
public Object next() {
return elementData[nextIndex++];
// Object returnData = elementData[nextIndex];
// nextIndex++;
// return returnData;
}
1.8 hasNext()
ArrayList.ListIterator li = numbers.listIterator();
while (true) {
System.out.println(li.next());
}
- next()를 반복문으로 사용하면 위와같이 반복문이 멈추지 않고, elementData[]의 사이즈를 전부 출력하여 에러를 발생시킴
- 따라서, next()를 반복문과 같이 사용할 때 반복을 제어하기 위해 조건문으로 hasNext()를 사용함.
ArrayList.ListIterator li = numbers.listIterator();
while (li.hasNext()) {
System.out.println(li.next());
}
public boolean hasNext() {
return nextIndex < size();
}
- next()를 호출하기 전에 hasNext()를 먼저 호출하여 next()로 불러올 수 있는 값이 있는지 확인
- 현재 리턴할 element를 가르키는 nextIndex와 elementData[]의 size를 비교하여 size보다 nextIndex가 작으면 아직 마지막 요소까지 도달하지 않아 출력할 element가 있다고 간주하여 true를 출력하고 반복문을 계속 실행시킴.
'Study > DataStructure' 카테고리의 다른 글
Stack(Java) (0) | 2020.02.18 |
---|---|
생활코딩 DataStructure -5 (0) | 2020.02.17 |
생활코딩 DataStructure -4 (0) | 2020.02.15 |
생활코딩 DataStructure -2 (0) | 2020.02.13 |
생활코딩 DataStructure -1 (0) | 2020.02.12 |
- 20200415
- 20200504
- 백준
- 20200510
- likelion
- 20200502
- 20200423
- 20200429
- 20200624
- chapter8
- 20200425
- 20200428
- 20200503
- 생활코딩리눅스
- 20200403
- 20200406
- 20200317
- 20200421
- 20200417
- 20200512
- 20200330
- 20200319
- 20200420
- 20200804
- 20200622
- 20200424
- 20201204
- 20200427
- chapter7
- 20200413
- Total
- Today
- Yesterday