📄 contentlist.java
字号:
if (index == adjusted) {
return i;
}
adjusted++;
}
}
if (index == adjusted) {
return ContentList.this.size;
}
return ContentList.this.size + 1;
}
}
/* * * * * * * * * * * * * FilterListIterator * * * * * * * * * * * */
/* * * * * * * * * * * * * FilterListIterator * * * * * * * * * * * */
class FilterListIterator implements ListIterator {
/** The Filter that applies */
Filter filter;
/** The last operation performed */
int lastOperation;
/** Initial start index in backing list */
int initialCursor;
/** Index in backing list of next object */
int cursor;
/** Index in backing list of last object returned */
int last;
/** Expected modCount in our backing list */
int expected;
/**
* Default constructor
*/
FilterListIterator(Filter filter, int start) {
this.filter = filter;
initialCursor = initializeCursor(start);
last = -1;
expected = ContentList.this.getModCount();
lastOperation = CREATE;
}
/**
* Returns <code>true</code> if this list iterator has a next element.
*/
public boolean hasNext() {
checkConcurrentModification();
switch(lastOperation) {
case CREATE: cursor = initialCursor;
break;
case PREV: cursor = last;
break;
case ADD:
case NEXT: cursor = moveForward(last + 1);
break;
case REMOVE: cursor = moveForward(last);
break;
case HASPREV: cursor = moveForward(cursor + 1);
break;
case HASNEXT: break;
default: throw new IllegalStateException("Unknown operation");
}
if (lastOperation != CREATE) {
lastOperation = HASNEXT;
}
return (cursor < ContentList.this.size()) ? true : false;
}
/**
* Returns the next element in the list.
*/
public Object next() {
checkConcurrentModification();
if (hasNext()) {
last = cursor;
}
else {
last = ContentList.this.size();
throw new NoSuchElementException();
}
lastOperation = NEXT;
return ContentList.this.get(last);
}
/**
* Returns <code>true</code> if this list iterator has more
* elements when traversing the list in the reverse direction.
*/
public boolean hasPrevious() {
checkConcurrentModification();
switch(lastOperation) {
case CREATE: cursor = initialCursor;
int size = ContentList.this.size();
if (cursor >= size) {
cursor = moveBackward(size - 1);
}
break;
case PREV:
case REMOVE: cursor = moveBackward(last - 1);
break;
case HASNEXT: cursor = moveBackward(cursor - 1);
break;
case ADD:
case NEXT: cursor = last;
break;
case HASPREV: break;
default: throw new IllegalStateException("Unknown operation");
}
if (lastOperation != CREATE) {
lastOperation = HASPREV;
}
return (cursor < 0) ? false : true;
}
/**
* Returns the previous element in the list.
*/
public Object previous() {
checkConcurrentModification();
if (hasPrevious()) {
last = cursor;
}
else {
last = -1;
throw new NoSuchElementException();
}
lastOperation = PREV;
return ContentList.this.get(last);
}
/**
* Returns the index of the element that would be returned by a
* subsequent call to <code>next</code>.
*/
public int nextIndex() {
checkConcurrentModification();
hasNext();
int count = 0;
for (int i = 0; i < ContentList.this.size(); i++) {
if (filter.matches(ContentList.this.get(i))) {
if (i == cursor) {
return count;
}
count++;
}
}
expected = ContentList.this.getModCount();
return count;
}
/**
* Returns the index of the element that would be returned by a
* subsequent call to <code>previous</code>. (Returns -1 if the
* list iterator is at the beginning of the list.)
*/
public int previousIndex() {
checkConcurrentModification();
if (hasPrevious()) {
int count = 0;
for (int i = 0; i < ContentList.this.size(); i++) {
if (filter.matches(ContentList.this.get(i))) {
if (i == cursor) {
return count;
}
count++;
}
}
}
return -1;
}
/**
* Inserts the specified element into the list.
*/
public void add(Object obj) {
checkConcurrentModification();
if (filter.matches(obj)) {
last = cursor + 1;
ContentList.this.add(last, obj);
}
else {
throw new IllegalAddException("Filter won't allow add of " +
(obj.getClass()).getName());
}
expected = ContentList.this.getModCount();
lastOperation = ADD;
}
/**
* Removes from the list the last element that was returned by
* <code>next</code> or <code>previous</code>.
* the last call to <code>next</code> or <code>previous</code>.
*/
public void remove() {
checkConcurrentModification();
if ((last < 0) || (lastOperation == REMOVE)) {
throw new IllegalStateException("no preceeding call to " +
"prev() or next()");
}
if (lastOperation == ADD) {
throw new IllegalStateException("cannot call remove() " +
"after add()");
}
Object old = ContentList.this.get(last);
if (filter.matches(old)) {
ContentList.this.remove(last);
}
else throw new IllegalAddException("Filter won't allow " +
(old.getClass()).getName() +
" (index " + last +
") to be removed");
expected = ContentList.this.getModCount();
lastOperation = REMOVE;
}
/**
* Replaces the last element returned by <code>next</code> or
* <code>previous</code> with the specified element.
*/
public void set(Object obj) {
checkConcurrentModification();
if ((lastOperation == ADD) || (lastOperation == REMOVE)) {
throw new IllegalStateException("cannot call set() after " +
"add() or remove()");
}
if (last < 0) {
throw new IllegalStateException("no preceeding call to " +
"prev() or next()");
}
if (filter.matches(obj)) {
Object old = ContentList.this.get(last);
if (!filter.matches(old)) {
throw new IllegalAddException("Filter won't allow " +
(old.getClass()).getName() + " (index " +
last + ") to be removed");
}
ContentList.this.set(last, obj);
}
else {
throw new IllegalAddException("Filter won't allow index " +
last + " to be set to " +
(obj.getClass()).getName());
}
expected = ContentList.this.getModCount();
// Don't set lastOperation
}
/**
* Returns index in the backing list by moving forward start
* objects that match our filter.
*/
private int initializeCursor(int start) {
if (start < 0) {
throw new IndexOutOfBoundsException("Index: " + start);
}
int count = 0;
for (int i = 0; i < ContentList.this.size(); i++) {
Object obj = ContentList.this.get(i);
if (filter.matches(obj)) {
if (start == count) {
return i;
}
count++;
}
}
if (start > count) {
throw new IndexOutOfBoundsException("Index: " + start +
" Size: " + count);
}
return ContentList.this.size();
}
/**
* Returns index in the backing list of the next object matching
* our filter, starting at the given index and moving forwards.
*/
private int moveForward(int start) {
if (start < 0) {
start = 0;
}
for (int i = start; i < ContentList.this.size(); i++) {
Object obj = ContentList.this.get(i);
if (filter.matches(obj)) {
return i;
}
}
return ContentList.this.size();
}
/**
* Returns index in the backing list of the next object matching
* our filter, starting at the given index and moving backwards.
*/
private int moveBackward(int start) {
if (start >= ContentList.this.size()) {
start = ContentList.this.size() - 1;
}
for (int i = start; i >= 0; --i) {
Object obj = ContentList.this.get(i);
if (filter.matches(obj)) {
return i;
}
}
return -1;
}
/**
* Check if are backing list is being modified by someone else.
*/
private void checkConcurrentModification() {
if (expected != ContentList.this.getModCount()) {
throw new ConcurrentModificationException();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -