package edu.berkeley.nlp.util;
import java.util.AbstractList;
import java.util.List;
/**
* Concatenates two lists without building a new one. Unmodifiable.
*
* @author adampauls
*
* @param <K>
*/
public class ConcatenationList<K> extends AbstractList<K>
{
private List<List<K>> lists;
private int size = 0;
private int[] cumulativeSize;
public ConcatenationList(List<List<K>> lists)
{
this.lists = lists;
cumulativeSize = new int[lists.size()];
int i = 0;
for (List<K> set : lists)
{
cumulativeSize[i++] = i == 0 ? 0 : cumulativeSize[i - 1] + set.size();
size += set.size();
}
}
@Override
public int size()
{
return size;
}
@Override
public K get(int arg0)
{
K k = binarySearch(lists.size() / 2, arg0);
return k;
}
private K binarySearch(int listIndex, int i)
{
if (i >= cumulativeSize[listIndex] && (listIndex == lists.size() || i < cumulativeSize[listIndex + 1])) { return lists.get(listIndex).get(
i - cumulativeSize[listIndex]); }
if (i >= cumulativeSize[listIndex + 1]) return binarySearch((lists.size() - listIndex) / 2, i);
assert i < cumulativeSize[listIndex];
return binarySearch(listIndex / 2, i);
}
}