add AbstractList and AbstractSequentialList classes to java.util and listIterator methods to java.util.List

This commit is contained in:
Joel Dice 2009-08-04 17:24:29 -06:00
parent 93597a4d1d
commit 7911989055
9 changed files with 223 additions and 25 deletions

View File

@ -0,0 +1,15 @@
/* Copyright (c) 2009, Avian Contributors
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
in all copies.
There is NO WARRANTY for this software. See license.txt for
details. */
package java.util;
public abstract class AbstractList<T> extends AbstractCollection<T>
implements List<T>
{ }

View File

@ -0,0 +1,15 @@
/* Copyright (c) 2009, Avian Contributors
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted, provided
that the above copyright notice and this permission notice appear
in all copies.
There is NO WARRANTY for this software. See license.txt for
details. */
package java.util;
public abstract class AbstractSequentialList<T> extends AbstractList<T>
implements List<T>
{ }

View File

@ -10,7 +10,7 @@
package java.util;
public class ArrayList<T> implements List<T> {
public class ArrayList<T> extends AbstractList<T> {
private static final int MinimumCapacity = 16;
private Object[] array;
@ -169,7 +169,7 @@ public class ArrayList<T> implements List<T> {
}
public Iterator<T> iterator() {
return new Collections.ArrayListIterator(this);
return listIterator();
}
public ListIterator<T> listIterator(int index) {

View File

@ -102,7 +102,15 @@ public class Arrays {
}
public Iterator<T> iterator() {
return new Collections.ArrayListIterator(this);
return listIterator();
}
public ListIterator<T> listIterator(int index) {
return new Collections.ArrayListIterator(this, index);
}
public ListIterator<T> listIterator() {
return listIterator(0);
}
};
}

View File

@ -198,7 +198,6 @@ public class Collections {
return new SynchronizedMap<K, V> (map);
}
static class SynchronizedSet<T>
extends SynchronizedCollection<T>
implements Set<T>
@ -232,7 +231,7 @@ public class Collections {
static class ArrayListIterator<T> implements ListIterator<T> {
private final List<T> list;
private boolean canRemove = false;
private int toRemove = -1;
private int index;
public ArrayListIterator(List<T> list) {
@ -250,7 +249,7 @@ public class Collections {
public T previous() {
if (hasPrevious()) {
canRemove = true;
toRemove = index;
return list.get(index--);
} else {
throw new NoSuchElementException();
@ -259,8 +258,8 @@ public class Collections {
public T next() {
if (hasNext()) {
canRemove = true;
return list.get(++index);
toRemove = ++index;
return list.get(index);
} else {
throw new NoSuchElementException();
}
@ -271,9 +270,10 @@ public class Collections {
}
public void remove() {
if (canRemove) {
canRemove = false;
list.remove(index--);
if (toRemove != -1) {
list.remove(toRemove);
index = toRemove - 1;
toRemove = -1;
} else {
throw new IllegalStateException();
}

View File

@ -10,7 +10,7 @@
package java.util;
public class LinkedList<T> implements List<T> {
public class LinkedList<T> extends AbstractSequentialList<T> {
private Cell<T> front;
private Cell<T> rear;
private int size;
@ -198,7 +198,19 @@ public class LinkedList<T> implements List<T> {
}
public Iterator<T> iterator() {
return new MyIterator(front);
return listIterator();
}
public ListIterator<T> listIterator(int index) {
MyIterator it = new MyIterator();
for (int i = 0; i < index; ++i) {
it.next();
}
return it;
}
public ListIterator<T> listIterator() {
return listIterator(0);
}
public String toString() {
@ -217,18 +229,29 @@ public class LinkedList<T> implements List<T> {
}
}
private class MyIterator implements Iterator<T> {
private class MyIterator implements ListIterator<T> {
private Cell<T> toRemove;
private Cell<T> current;
private Cell<T> next;
public MyIterator(Cell<T> start) {
next = start;
public T previous() {
if (hasPrevious()) {
T v = current.value;
toRemove = current;
current = current.prev;
return v;
} else {
throw new NoSuchElementException();
}
}
public T next() {
if (hasNext()) {
current = next;
next = next.next;
if (current == null) {
current = front;
} else {
current = current.next;
}
toRemove = current;
return current.value;
} else {
throw new NoSuchElementException();
@ -236,13 +259,22 @@ public class LinkedList<T> implements List<T> {
}
public boolean hasNext() {
return next != null;
if (current == null) {
return front != null;
} else {
return current.next != null;
}
}
public boolean hasPrevious() {
return current != null;
}
public void remove() {
if (current != null) {
LinkedList.this.remove(current);
current = null;
if (toRemove != null) {
current = toRemove.prev;
LinkedList.this.remove(toRemove);
toRemove = null;
} else {
throw new IllegalStateException();
}

View File

@ -22,4 +22,8 @@ public interface List<T> extends Collection<T> {
public void add(int index, T element);
public boolean isEmpty();
public ListIterator<T> listIterator(int index);
public ListIterator<T> listIterator();
}

View File

@ -10,7 +10,7 @@
package java.util;
public class Vector<T> implements List<T> {
public class Vector<T> extends AbstractList<T> {
private final ArrayList<T> list;
public Vector(int capacity) {
@ -112,7 +112,15 @@ public class Vector<T> implements List<T> {
}
public Iterator<T> iterator() {
return new Collections.ArrayListIterator(this);
return listIterator();
}
public ListIterator<T> listIterator(int index) {
return new Collections.ArrayListIterator(this, index);
}
public ListIterator<T> listIterator() {
return listIterator(0);
}
public Enumeration<T> elements() {

View File

@ -1,4 +1,6 @@
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.ListIterator;
public class List {
private static void expect(boolean v) {
@ -21,6 +23,114 @@ public class List {
expect(s1.equals(s2));
}
private static void testIterators(java.util.List<Integer> l) {
l.add(1);
l.add(2);
l.add(3);
ListIterator<Integer> it = l.listIterator();
expect(it.next().equals(Integer.valueOf(1)));
expect(it.next().equals(Integer.valueOf(2)));
expect(it.next().equals(Integer.valueOf(3)));
expect(! it.hasNext());
it = l.listIterator(1);
expect(it.next().equals(Integer.valueOf(2)));
expect(it.next().equals(Integer.valueOf(3)));
expect(! it.hasNext());
it = l.listIterator(2);
expect(it.next().equals(Integer.valueOf(3)));
expect(! it.hasNext());
it = l.listIterator(3);
expect(it.previous().equals(Integer.valueOf(3)));
expect(it.previous().equals(Integer.valueOf(2)));
expect(it.previous().equals(Integer.valueOf(1)));
expect(! it.hasPrevious());
it = l.listIterator(2);
expect(it.previous().equals(Integer.valueOf(2)));
expect(it.previous().equals(Integer.valueOf(1)));
expect(! it.hasPrevious());
it = l.listIterator(1);
expect(it.previous().equals(Integer.valueOf(1)));
expect(! it.hasPrevious());
}
private static void testIterators2(java.util.List<Integer> l) {
l.add(1);
l.add(2);
l.add(3);
ListIterator<Integer> it = l.listIterator();
expect(it.next().equals(Integer.valueOf(1)));
it.remove();
expect(it.next().equals(Integer.valueOf(2)));
it.remove();
expect(it.next().equals(Integer.valueOf(3)));
it.remove();
expect(! it.hasNext());
expect(l.isEmpty());
l.add(1);
l.add(2);
l.add(3);
it = l.listIterator(1);
expect(it.next().equals(Integer.valueOf(2)));
it.remove();
expect(it.next().equals(Integer.valueOf(3)));
it.remove();
expect(! it.hasNext());
expect(l.size() == 1);
l.add(2);
l.add(3);
it = l.listIterator(2);
expect(it.next().equals(Integer.valueOf(3)));
it.remove();
expect(! it.hasNext());
expect(l.size() == 2);
l.add(3);
it = l.listIterator(3);
expect(it.previous().equals(Integer.valueOf(3)));
it.remove();
expect(it.previous().equals(Integer.valueOf(2)));
it.remove();
expect(it.previous().equals(Integer.valueOf(1)));
it.remove();
expect(! it.hasPrevious());
expect(l.isEmpty());
l.add(1);
l.add(2);
l.add(3);
it = l.listIterator(2);
expect(it.previous().equals(Integer.valueOf(2)));
it.remove();
expect(it.previous().equals(Integer.valueOf(1)));
it.remove();
expect(! it.hasPrevious());
expect(l.size() == 1);
l.clear();
l.add(1);
l.add(2);
l.add(3);
it = l.listIterator(1);
expect(it.previous().equals(Integer.valueOf(1)));
it.remove();
expect(! it.hasPrevious());
expect(l.size() == 2);
}
public static void main(String args[]) {
ArrayList<Integer> l = new ArrayList<Integer>();
l.add(1); l.add(2); l.add(3); l.add(4); l.add(5);
@ -39,5 +149,11 @@ public class List {
for (int i=0; i < z.length; i++) {
System.out.println(z[i]);
}
testIterators(new ArrayList());
testIterators(new LinkedList());
testIterators2(new ArrayList());
testIterators2(new LinkedList());
}
}