Collections Data Structure Java

///////////////////////////////////////////////////////////////////////////////
//Copyright (C) 2003 Jeremy LaCivita
//
//This library is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public
//License as published by the Free Software Foundation; either
//version 2.1 of the License, or (at your option) any later version.
//
//This library is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public
//License along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//////////////////////////////////////////////////////////////////////////////
//package opennlp.tools.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
/** 
 * Class which creates mapping between keys and a list of values.  
 */
public class HashList extends HashMap {
  private static final long serialVersionUID = 1;
  
  public HashList() {
    super();
  }
  
  public Object get(Object key, int index) {
    if (get(key) == null) {
      return get(key);
    }
    else {
      return ((List)get(key)).get(index);
    }
  }
  public Object putAll(Object key, Collection values) {
    List o = (List)get(key);
    if (o == null) {
      o = new ArrayList();
      super.put(key, o);
    }
    o.addAll(values);
    if (o.size() == values.size())
      return null;
    else
      return o;
  }
  public Object put(Object key, Object value) {
    List o = (List)get(key);
    
    if (o == null) {
      o = new ArrayList();
      super.put(key, o);
    } 
    o.add(value);
    if(o.size() == 1)
      return null;
    else
      return o;
  }
  public boolean remove(Object key, Object value) {
    List l = (List) get(key);
    if (l == null) {
      return false;
    }
    else {
      boolean r = l.remove(value);
      if (l.size() == 0) {
  remove(key);
      }
      return r;
    }
  }
}