package jde.util; import java.util.*; /** * A HashMap subclass which adds multiple values with the same key to * a List of values. Single values remain single keys, obviating the * need to cart around single-element Lists. * * Copyright (C) 2001 Eric D. Friedman (eric@hfriedman.rdsl.lmi.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Created: Tue Aug 14 19:36:50 2001 * * @author Eric D. Friedman * @version $Id: MultiValueMap.java,v 1.1 2001/08/15 06:31:27 eric Exp $ */ public class MultiValueMap extends HashMap { public MultiValueMap () { super(); } /** * Convenience method for retrieving the value for * key as a List, even when there is only a single * value for that key in the map. The EMPTY_LIST is returned when * no value is found for key making null checks * unnecessary. * * @param key an Object value * @return a List value */ public List getAsList(Object key) { if (containsKey(key)) { Object o = get(key); if (o instanceof List) { return (List)o; } else { return Arrays.asList(new Object[] { o }); } // end of else } else { return Collections.EMPTY_LIST; } // end of else } /** * inserts value into the map for key as a single element or, if * values already exist, as an entry in key's list. * * @param key an Object value * @param value an Object value * @return null */ public Object put(Object key, Object value) { if (containsKey(key)) { Object other = get(key); if (other instanceof List) { ((List)other).add(value); } else { List l = new ArrayList(); l.add(other); l.add(value); super.put(key, l); } } else { super.put(key,value); } return null; } }// MultiValueMap