3
0
This commit is contained in:
Prototik 2015-10-22 14:25:47 +07:00
parent ad909f2788
commit 4cfa07d415

View File

@ -5,29 +5,27 @@ import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
public class LinkedHelper<T> { public class LinkedHelper<T> {
private Iterable<T> mIterable; private final Iterable<T> mIterable;
private Iterator<T> mIterator; private volatile Iterator<T> mIndexIterator;
private int iteratorIndex; private volatile int mIndex;
private T indexValue; private volatile T mIndexValue;
public LinkedHelper(Iterable<T> iterable) { public LinkedHelper(Iterable<T> iterable) {
mIterable = iterable; mIterable = iterable;
} }
public T get(int index) { public synchronized T get(int index) {
if (iteratorIndex > index || mIterator == null) { if (mIndexIterator == null || mIndex > index) {
mIterator = mIterable.iterator(); mIndexIterator = mIterable.iterator();
iteratorIndex = -1; mIndex = -1;
} }
while (iteratorIndex < index) { if (mIndex == index) return mIndexValue;
if (mIterator.hasNext()) { T value = null;
indexValue = mIterator.next(); while (mIndex < index) {
iteratorIndex++; value = mIndexIterator.next();
} else { mIndex++;
throw new IndexOutOfBoundsException();
} }
} return mIndexValue = value;
return indexValue;
} }
public int indexOf(Object o) { public int indexOf(Object o) {
@ -43,7 +41,6 @@ public class LinkedHelper<T> {
public int lastIndexOf(Object o) { public int lastIndexOf(Object o) {
if (!(mIterable instanceof List)) { if (!(mIterable instanceof List)) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
ListIterator<T> iterator = ((List<T>) mIterable).listIterator(); ListIterator<T> iterator = ((List<T>) mIterable).listIterator();
int i = 0; int i = 0;
@ -114,7 +111,7 @@ public class LinkedHelper<T> {
@Override @Override
public int nextIndex() { public int nextIndex() {
return mNextIndex; return mListIterator != null ? mListIterator.nextIndex() : mNextIndex;
} }
@Override @Override
@ -131,8 +128,7 @@ public class LinkedHelper<T> {
@Override @Override
public void remove() { public void remove() {
ensureListIterator(); mIterator.remove();
mListIterator.remove();
} }
@Override @Override