📄 abstractlinkedlist.java
字号:
}
/**
* Gets the next node.
*
* @return the next node
* @since Commons Collections 3.1
*/
protected Node getNextNode() {
return next;
}
/**
* Sets the next node.
*
* @param next the next node
* @since Commons Collections 3.1
*/
protected void setNextNode(Node next) {
this.next = next;
}
}
//-----------------------------------------------------------------------
/**
* A list iterator over the linked list.
*/
protected static class LinkedListIterator implements ListIterator, OrderedIterator {
/** The parent list */
protected final AbstractLinkedList parent;
/**
* The node that will be returned by {@link #next()}. If this is equal
* to {@link AbstractLinkedList#header} then there are no more values to return.
*/
protected Node next;
/**
* The index of {@link #next}.
*/
protected int nextIndex;
/**
* The last node that was returned by {@link #next()} or {@link
* #previous()}. Set to <code>null</code> if {@link #next()} or {@link
* #previous()} haven't been called, or if the node has been removed
* with {@link #remove()} or a new node added with {@link #add(Object)}.
* Should be accessed through {@link #getLastNodeReturned()} to enforce
* this behaviour.
*/
protected Node current;
/**
* The modification count that the list is expected to have. If the list
* doesn't have this count, then a
* {@link java.util.ConcurrentModificationException} may be thrown by
* the operations.
*/
protected int expectedModCount;
/**
* Create a ListIterator for a list.
*
* @param parent the parent list
* @param fromIndex the index to start at
*/
protected LinkedListIterator(AbstractLinkedList parent, int fromIndex) throws IndexOutOfBoundsException {
super();
this.parent = parent;
this.expectedModCount = parent.modCount;
this.next = parent.getNode(fromIndex, true);
this.nextIndex = fromIndex;
}
/**
* Checks the modification count of the list is the value that this
* object expects.
*
* @throws ConcurrentModificationException If the list's modification
* count isn't the value that was expected.
*/
protected void checkModCount() {
if (parent.modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
/**
* Gets the last node returned.
*
* @throws IllegalStateException If {@link #next()} or
* {@link #previous()} haven't been called, or if the node has been removed
* with {@link #remove()} or a new node added with {@link #add(Object)}.
*/
protected Node getLastNodeReturned() throws IllegalStateException {
if (current == null) {
throw new IllegalStateException();
}
return current;
}
public boolean hasNext() {
return next != parent.header;
}
public Object next() {
checkModCount();
if (!hasNext()) {
throw new NoSuchElementException("No element at index " + nextIndex + ".");
}
Object value = next.getValue();
current = next;
next = next.next;
nextIndex++;
return value;
}
public boolean hasPrevious() {
return next.previous != parent.header;
}
public Object previous() {
checkModCount();
if (!hasPrevious()) {
throw new NoSuchElementException("Already at start of list.");
}
next = next.previous;
Object value = next.getValue();
current = next;
nextIndex--;
return value;
}
public int nextIndex() {
return nextIndex;
}
public int previousIndex() {
// not normally overridden, as relative to nextIndex()
return nextIndex() - 1;
}
public void remove() {
checkModCount();
if (current == next) {
// remove() following previous()
next = next.next;
parent.removeNode(getLastNodeReturned());
} else {
// remove() following next()
parent.removeNode(getLastNodeReturned());
nextIndex--;
}
current = null;
expectedModCount++;
}
public void set(Object obj) {
checkModCount();
getLastNodeReturned().setValue(obj);
}
public void add(Object obj) {
checkModCount();
parent.addNodeBefore(next, obj);
current = null;
nextIndex++;
expectedModCount++;
}
}
//-----------------------------------------------------------------------
/**
* A list iterator over the linked sub list.
*/
protected static class LinkedSubListIterator extends LinkedListIterator {
/** The parent list */
protected final LinkedSubList sub;
protected LinkedSubListIterator(LinkedSubList sub, int startIndex) {
super(sub.parent, startIndex + sub.offset);
this.sub = sub;
}
public boolean hasNext() {
return (nextIndex() < sub.size);
}
public boolean hasPrevious() {
return (previousIndex() >= 0);
}
public int nextIndex() {
return (super.nextIndex() - sub.offset);
}
public void add(Object obj) {
super.add(obj);
sub.expectedModCount = parent.modCount;
sub.size++;
}
public void remove() {
super.remove();
sub.expectedModCount = parent.modCount;
sub.size--;
}
}
//-----------------------------------------------------------------------
/**
* The sublist implementation for AbstractLinkedList.
*/
protected static class LinkedSubList extends AbstractList {
/** The main list */
AbstractLinkedList parent;
/** Offset from the main list */
int offset;
/** Sublist size */
int size;
/** Sublist modCount */
int expectedModCount;
protected LinkedSubList(AbstractLinkedList parent, int fromIndex, int toIndex) {
if (fromIndex < 0) {
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
}
if (toIndex > parent.size()) {
throw new IndexOutOfBoundsException("toIndex = " + toIndex);
}
if (fromIndex > toIndex) {
throw new IllegalArgumentException("fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");
}
this.parent = parent;
this.offset = fromIndex;
this.size = toIndex - fromIndex;
this.expectedModCount = parent.modCount;
}
public int size() {
checkModCount();
return size;
}
public Object get(int index) {
rangeCheck(index, size);
checkModCount();
return parent.get(index + offset);
}
public void add(int index, Object obj) {
rangeCheck(index, size + 1);
checkModCount();
parent.add(index + offset, obj);
expectedModCount = parent.modCount;
size++;
LinkedSubList.this.modCount++;
}
public Object remove(int index) {
rangeCheck(index, size);
checkModCount();
Object result = parent.remove(index + offset);
expectedModCount = parent.modCount;
size--;
LinkedSubList.this.modCount++;
return result;
}
public boolean addAll(Collection coll) {
return addAll(size, coll);
}
public boolean addAll(int index, Collection coll) {
rangeCheck(index, size + 1);
int cSize = coll.size();
if (cSize == 0) {
return false;
}
checkModCount();
parent.addAll(offset + index, coll);
expectedModCount = parent.modCount;
size += cSize;
LinkedSubList.this.modCount++;
return true;
}
public Object set(int index, Object obj) {
rangeCheck(index, size);
checkModCount();
return parent.set(index + offset, obj);
}
public void clear() {
checkModCount();
Iterator it = iterator();
while (it.hasNext()) {
it.next();
it.remove();
}
}
public Iterator iterator() {
checkModCount();
return parent.createSubListIterator(this);
}
public ListIterator listIterator(final int index) {
rangeCheck(index, size + 1);
checkModCount();
return parent.createSubListListIterator(this, index);
}
public List subList(int fromIndexInclusive, int toIndexExclusive) {
return new LinkedSubList(parent, fromIndexInclusive + offset, toIndexExclusive + offset);
}
protected void rangeCheck(int index, int beyond) {
if (index < 0 || index >= beyond) {
throw new IndexOutOfBoundsException("Index '" + index + "' out of bounds for size '" + size + "'");
}
}
protected void checkModCount() {
if (parent.modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -