org.opentripplanner.util.JoinedList Maven / Gradle / Ivy
package org.opentripplanner.util;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
/** Treat multiple lists as a single list */
public class JoinedList implements List {
private List[] lists;
private int totalSize;
public JoinedList(List ... lists) {
this.lists = lists;
totalSize = 0;
for (List list : lists) {
totalSize += list.size();
}
}
@Override
public boolean add(E arg0) {
throw new UnsupportedOperationException();
}
@Override
public void add(int arg0, E arg1) {
throw new UnsupportedOperationException();
}
@Override
public boolean addAll(Collection extends E> arg0) {
throw new UnsupportedOperationException();
}
@Override
public boolean addAll(int arg0, Collection extends E> arg1) {
throw new UnsupportedOperationException();
}
@Override
public void clear() {
throw new UnsupportedOperationException();
}
@Override
public boolean contains(Object needle) {
for (List list : lists) {
if (list.contains(needle)) {
return true;
}
}
return false;
}
@Override
public boolean containsAll(Collection> needles) {
for (Object needle : needles) {
if (!contains(needle)) {
return false;
}
}
return true;
}
@Override
public E get(int i) {
for (List list : lists) {
if (i < list.size()) {
return list.get(i);
}
i -= list.size();
}
throw new ArrayIndexOutOfBoundsException(i);
}
@Override
public int indexOf(Object needle) {
int i = 0;
for (List list : lists) {
int index = list.indexOf(needle);
if (index >= 0) {
return index + i;
}
i += list.size();
}
return -1;
}
@Override
public boolean isEmpty() {
for (List list : lists) {
if (!list.isEmpty()) {
return false;
}
}
return true;
}
@Override
public Iterator iterator() {
return new JoinedListIterator();
}
class JoinedListIterator implements ListIterator {
private int listIndex;
private ListIterator iterator;
JoinedListIterator(){
listIndex = 0;
}
@Override
public boolean hasNext() {
if (iterator == null) {
iterator = lists[listIndex].listIterator();
}
while (!iterator.hasNext()) {
listIndex += 1;
if (listIndex == lists.length) {
return false;
}
iterator = lists[listIndex].listIterator();
}
return listIndex != lists.length;
}
@Override
public E next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
if (iterator == null) {
iterator = lists[listIndex].listIterator();
}
while (!iterator.hasNext()) {
listIndex += 1;
if (listIndex == lists.length) {
throw new NoSuchElementException();
}
iterator = lists[listIndex].listIterator();
}
return iterator.next();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
@Override
public void add(E arg0) {
throw new UnsupportedOperationException();
}
@Override
public boolean hasPrevious() {
throw new UnsupportedOperationException();
}
@Override
public int nextIndex() {
int nextIndex = 0;
for (int i = 0; i < listIndex; ++i) {
nextIndex += lists[i].size();
}
return nextIndex + iterator.nextIndex();
}
@Override
public E previous() {
throw new UnsupportedOperationException();
}
@Override
public int previousIndex() {
throw new UnsupportedOperationException();
}
@Override
public void set(E arg0) {
throw new UnsupportedOperationException();
}
}
@Override
public int lastIndexOf(Object needle) {
int i = totalSize;
for (List list : lists) {
i -= list.size();
int index = list.lastIndexOf(needle);
if (index >= 0) {
return i + index;
}
}
return -1;
}
@Override
public ListIterator listIterator() {
return new JoinedListIterator();
}
@Override
public ListIterator listIterator(int arg0) {
//fixme: this is slow and stupid
JoinedListIterator result = new JoinedListIterator();
for (int i = 0; i < arg0; ++i) {
result.next();
}
return result;
}
@Override
public boolean remove(Object arg0) {
throw new UnsupportedOperationException();
}
@Override
public E remove(int arg0) {
throw new UnsupportedOperationException();
}
@Override
public boolean removeAll(Collection> arg0) {
throw new UnsupportedOperationException();
}
@Override
public boolean retainAll(Collection> arg0) {
throw new UnsupportedOperationException();
}
@Override
public E set(int arg0, E arg1) {
throw new UnsupportedOperationException();
}
@Override
public int size() {
return totalSize;
}
@Override
public List subList(int arg0, int arg1) {
throw new UnsupportedOperationException();
}
@Override
public Object[] toArray() {
Object[] array = new Object[totalSize];
Iterator i = iterator();
int p = 0;
while (i.hasNext()) {
array[p++] = i.next();
}
return array;
}
@SuppressWarnings("unchecked")
@Override
public T[] toArray(T[] out) {
if (out.length < totalSize) {
out = (T[]) Arrays.copyOf(out, totalSize, out.getClass());
}
Iterator i = iterator();
int p = 0;
while (i.hasNext()) {
out[p++] = (T) i.next();
}
if (out.length > totalSize) {
out[p] = null;
}
return out;
}
}