📄 persistentlistimpl.java
字号:
public Object set(int i, Object obj) {
if (i < 0 || i >= nElems) {
throw new IndexOutOfBoundsException("index=" + i + ", size=" + nElems);
}
return root.set(i, obj);
}
public Object[] toArray() {
int n = nElems;
Object[] arr = new Object[n];
Iterator iterator = listIterator(0);
for (int i = 0; i < n; i++) {
arr[i] = iterator.next();
}
return arr;
}
public Object[] toArray(Object[] arr) {
int n = nElems;
if (arr.length < n) {
throw new IllegalArgumentException();
}
Iterator iterator = listIterator(0);
for (int i = 0; i < n; i++) {
arr[i] = iterator.next();
}
return arr;
}
public boolean isEmpty() {
return nElems == 0;
}
public int size() {
return nElems;
}
public boolean contains(Object o) {
Iterator e = iterator();
if (o==null) {
while (e.hasNext()) {
if (e.next()==null) {
return true;
}
}
} else {
while (e.hasNext()) {
if (o.equals(e.next())) {
return true;
}
}
}
return false;
}
public boolean add(Object o) {
add(nElems, o);
return true;
}
public void add(int i, Object o) {
if (i < 0 || i > nElems) {
throw new IndexOutOfBoundsException("index=" + i + ", size=" + nElems);
}
IPersistent obj = (IPersistent)o;
ListPage overflow = root.add(i, obj);
if (overflow != null) {
ListIntermediatePage pg = new ListIntermediatePage(getStorage());
pg.setItem(0, overflow);
pg.items.set(1, root);
pg.nChildren[1] = Integer.MAX_VALUE;
pg.nItems = 2;
root = pg;
}
nElems += 1;
modCount += 1;
modify();
}
public Object remove(int i) {
if (i < 0 || i >= nElems) {
throw new IndexOutOfBoundsException("index=" + i + ", size=" + nElems);
}
Object obj = root.remove(i);
if (root.nItems == 1 && root instanceof ListIntermediatePage) {
ListPage newRoot = (ListPage)root.items.get(0);
root.deallocate();
root = newRoot;
}
nElems -= 1;
modCount += 1;
modify();
return obj;
}
public void clear() {
modCount += 1;
root.prune();
root = new ListPage(getStorage());
nElems = 0;
modify();
}
public int indexOf(Object o) {
ListItr e = (ListItr)listIterator();
if (o==null) {
while (e.hasNext())
if (e.next()==null)
return e.previousIndex();
} else {
while (e.hasNext())
if (o.equals(e.next()))
return e.previousIndex();
}
return -1;
}
public int lastIndexOf(Object o) {
ListItr e = (ListItr)listIterator();
if (o==null) {
while (e.hasPrevious())
if (e.previous()==null)
return e.nextIndex();
} else {
while (e.hasPrevious())
if (o.equals(e.previous()))
return e.nextIndex();
}
return -1;
}
public boolean addAll(int index, Collection c) {
boolean modified = false;
Iterator e = c.iterator();
while (e.hasNext()) {
add(index++, e.next());
modified = true;
}
return modified;
}
public Iterator iterator() {
return new Itr();
}
public Iterator listIterator() {
return listIterator(0);
}
public Iterator listIterator(int index) {
if (index<0 || index>size())
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
private class Itr extends Iterator {
TreePosition pos = new TreePosition();
/**
* Index of element to be returned by subsequent call to next.
*/
int cursor = 0;
/**
* Index of element returned by most recent call to next or
* previous. Reset to -1 if this element is deleted by a call
* to remove.
*/
int lastRet = -1;
/**
* The modCount value that the iterator believes that the backing
* List should have. If this expectation is violated, the iterator
* has detected concurrent modification.
*/
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size();
}
public int nextOid() {
checkForComodification();
try {
int oid = getRawPosition(pos, cursor).getOid();
lastRet = cursor++;
return oid;
} catch(IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public Object next() {
checkForComodification();
try {
Object next = getPosition(pos, cursor);
lastRet = cursor++;
return next;
} catch(IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public void remove() {
if (lastRet == -1) {
throw new IllegalStateException();
}
checkForComodification();
try {
PersistentListImpl.this.remove(lastRet);
if (lastRet < cursor) {
cursor--;
}
pos.page = null;
lastRet = -1;
expectedModCount = modCount;
} catch(IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
}
private class ListItr extends Itr {
ListItr(int index) {
cursor = index;
}
public boolean hasPrevious() {
return cursor != 0;
}
public Object previous() {
checkForComodification();
try {
int i = cursor - 1;
Object previous = getPosition(pos, i);
lastRet = cursor = i;
return previous;
} catch(IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public int nextIndex() {
return cursor;
}
public int previousIndex() {
return cursor-1;
}
public void set(Object o) {
if (lastRet == -1) {
throw new IllegalStateException();
}
checkForComodification();
try {
PersistentListImpl.this.set(lastRet, o);
expectedModCount = modCount;
} catch(IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
public void add(Object o) {
checkForComodification();
try {
PersistentListImpl.this.add(cursor++, o);
lastRet = -1;
pos.page = null;
expectedModCount = modCount;
} catch(IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
}
protected void removeRange(int fromIndex, int toIndex) {
while (fromIndex < toIndex) {
remove(fromIndex);
toIndex -= 1;
}
}
public boolean containsAll(Collection c) {
Iterator i = c.iterator();
while (i.hasNext()) {
if (!contains(i.next()))
return false;
}
return true;
}
public boolean addAll(Collection c) {
boolean modified = false;
Iterator i = c.iterator();
while (i.hasNext()) {
modified |= add(i.next());
}
return modified;
}
public boolean retainAll(Collection c) {
ArrayList toBeRemoved = new ArrayList();
Iterator i = iterator();
while (i.hasNext()) {
Object o = i.next();
if (!c.contains(o)) {
toBeRemoved.add(o);
}
}
int n = toBeRemoved.size();
for (int j = 0; j < n; j++) {
remove(toBeRemoved.get(j));
}
return n != 0;
}
public boolean removeAll(Collection c) {
boolean modified = false;
Iterator i = c.iterator();
while (i.hasNext()) {
modified |= remove(i.next());
}
return modified;
}
public boolean remove(Object o) {
Iterator e = iterator();
if (o==null) {
while (e.hasNext()) {
if (e.next()==null) {
e.remove();
return true;
}
}
} else {
while (e.hasNext()) {
if (o.equals(e.next())) {
e.remove();
return true;
}
}
}
return false;
}
public PersistentListImpl() {}
PersistentListImpl(Storage storage) {
super(storage);
root = new ListPage(storage);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -