code: package edu.berkeley.nlp.util;
  
  import java.util.AbstractList;
  import java.util.ArrayList;
  import java.util.List;
  
  /**
   * List which returns special boundary symbols hwen get() is called outside the
   * range of the list.
   * 
   * @author Dan Klein
   */
  public class BoundedList<E> extends AbstractList<E> {
  	private E leftBoundary;
  	private E rightBoundary;
  	private List<E> list;
  
  	/**
  	 * Returns the object at the given index, provided the index is between 0
  	 * (inclusive) and size() (exclusive). If the index is < 0, then a left
  	 * boundary object is returned. If the index is >= size(), a right boundary
  	 * object is returned. The default boundary objects are both null, unless
  	 * other objects are specified on construction.
  	 */
  	@Override
  	public E get(int index) {
  		if (index < 0)
  			return leftBoundary;
  		if (index >= list.size())
  			return rightBoundary;
  		return list.get(index);
  	}
  
  	@Override
  	public int size() {
  		return list.size();
  	}
  
  	public BoundedList(List<E> list, E leftBoundary, E rightBoundary) {
  		this.list = list;
  		this.leftBoundary = leftBoundary;
  		this.rightBoundary = rightBoundary;
  	}
  
  	public BoundedList(List<E> list, E boundary) {
  		this(list, boundary, boundary);
  	}
  
  	public BoundedList(List<E> list) {
  		this(list, null);
  	}
  
  	@Override
  	public List<E> subList(int fromIndex, int toIndex) {
  		List<E> retVal = new ArrayList<E>(toIndex - fromIndex);
  		for (int i = fromIndex; i < toIndex; ++i) {
  			retVal.add(get(i));
  		}
  		return retVal;
  	}
  
  }
  