15 내부 클래스 와 Array List 의 실현
5223 단어 데이터 구조 와 문제 풀이
내부 에 쓰 면 개인 적 인 것 이 고 내부 클래스 는 Public 의 디자인 에 문제 가 있 습 니 다. Public 가 되 었 으 니 내부 에 넣 어야 합 니 다. 내부 클래스 는 반드시 Public 이 어야 합 니 다. 초기 화 는 외부 클래스 의 인용 에 의존 해 야 합 니 다. 그렇지 않 으 면 클래스 정의 에 포 함 된 Outer. this 는 예화 할 수 없습니다.
Outer 방문 Inner: 반드시 inner 의 대상 을 만들어 야 합 니 다 (그렇지 않 으 면 실례 화 할 때 분명히 문제 가 있 습 니 다). 아니면 모두 static 입 니 다.Inner 는 Outer 에서 예화 한 후에 Inner 의 개인 속성 을 직접 사용 할 수 있 습 니 다. 이것 은 강제 규정 입 니 다. 물론 automic unt 의 규정 을 약간 파 괴 했 습 니 다. 내장 류 도 마찬가지 입 니 다.
Inner 방문 Outer: 기본적으로 Outer. this 참조 가 있 습 니 다. 물론 Outer 의 속성 과 방법 은 Inner 에서 직접 방문 할 수 있 습 니 다. Outer. this 구분 을 추가 하지 않 아 도 됩 니 다. (이름 이 이의 성 이 없 을 때 덮어 씁 니 다)
Array List 에 대한 디자인:
교체 기 reove () 가 더 좋 습 니 다. 물론 이 방법 은 다른 방법의 실현 에 지나치게 의존 하고 결합 이 큽 니 다. 예 를 들 어 내부 필드 expected ModCount 는 Array List 의 modCount 가 수정 되 는 것 을 알 아야 합 니 다.
Concurrent ModificationException 은 필드 modCount 를 통 해 이 루어 집 니 다. 물론 동기 화 되 지 않 았 기 때문에 동시 다발 할 때 오류 가 있 을 수 있 습 니 다. 힌트 를 주지 않 고 생각 일 뿐 입 니 다.
코드:
package nuaa.ds;
import java.util.AbstractCollection;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
public class ArrayList extends AbstractCollection implements List {
private static final int DEFAULT_CAPACITY = 2;
private static final int NOT_FOUND = -1;
private T[] theItems;
private int theSize;
private int modCount = 0;// ,
public ArrayList(){
clear();
}
public ArrayList(Collection extends T> c){
clear();
for(T obj:c)
add(obj);
}
@Override
public void clear() {
theSize = 0;
theItems = (T[])new Object[this.DEFAULT_CAPACITY];
modCount++;
}
@Override
public boolean addAll(int index, Collection extends T> c) {
// TODO Auto-generated method stub
return false;
}
@Override
public T get(int index) {
if(index<0||index>=size())
throw new ArrayIndexOutOfBoundsException();
return theItems[index];
}
@Override
public T set(int index, T element) {
if(index<0||index>size())
throw new ArrayIndexOutOfBoundsException();
T old = theItems[index];
theItems[index] = element;
return old;
}
@Override
public boolean contains(Object o) {
return findPos(o)!=NOT_FOUND;
}
private int findPos(Object o){
for(int i=0;i listIterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public ListIterator listIterator(int index) {
return new ArrayListIterator(index);
}
@Override
public List subList(int fromIndex, int toIndex) {
// TODO Auto-generated method stub
return null;
}
@Override
public Iterator iterator() {
return new ArrayListIterator(0);
}
@Override
public int size() {
return theSize;
}
private class ArrayListIterator implements ListIterator{
private int current;
private int expectedModCount = modCount;
private boolean nextCompleted = false;
private boolean prevCompleted = false;
ArrayListIterator(int pos){
if(pos<0||pos>size())
throw new IndexOutOfBoundsException();
current = pos;
}
@Override
public boolean hasNext() {
if(expectedModCount!=modCount)
throw new ConcurrentModificationException();
return current0;
}
@Override
public T previous() {
if(!hasPrevious()){
throw new NoSuchElementException();
}
prevCompleted = true;
nextCompleted = false;
return theItems[--current];
}
@Override
public int nextIndex() {
// TODO Auto-generated method stub
return 0;
}
@Override
public int previousIndex() {
// TODO Auto-generated method stub
return 0;
}
@Override
/**
* remove current,
* remove(obj)
*/
public void remove() {
if(expectedModCount!=modCount)
throw new ConcurrentModificationException();
if(nextCompleted)
ArrayList.this.remove(--current);// next current
else if(prevCompleted)
ArrayList.this.remove(current);
else
throw new IllegalStateException();
prevCompleted = nextCompleted = false;
expectedModCount++;// remove modCount
}
@Override
public void set(T e) {
// TODO Auto-generated method stub
}
@Override
public void add(T e) {
// TODO Auto-generated method stub
}
}
//cheap main
public static void main(String[] args){
ArrayList al = new ArrayList();
for(int i=0;i<20;i++){
al.add(i);
}
System.out.print(al.toString());
}
}