/* * Conditions Of Use * * This software was developed by employees of the National Institute of * Standards and Technology (NIST), an agency of the Federal Government. * Pursuant to title 15 Untied States Code Section 105, works of NIST * employees are not subject to copyright protection in the United States * and are considered to be in the public domain. As a result, a formal * license is not needed to use the software. * * This software is provided by NIST as a service and is expressly * provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT * AND DATA ACCURACY. NIST does not warrant or make any representations * regarding the use of the software or the results thereof, including but * not limited to the correctness, accuracy, reliability or usefulness of * the software. * * Permission to use this software is contingent upon your acceptance * of the terms of this agreement. * */ package gov.nist.core; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; public class MultiValueMapImpl<V> implements MultiValueMap<String, V>, Cloneable { private HashMap<String, ArrayList<V>> map = new HashMap<String, ArrayList<V>>(); private static final long serialVersionUID = 4275505380960964605L; public MultiValueMapImpl() { super(); } public List<V> put(String key, V value) { ArrayList<V> keyList = map.get(key); if (keyList == null) { keyList = new ArrayList<V>(10); map.put(key, keyList); } keyList.add(value); return keyList; } public boolean containsValue(Object value) { Set pairs = map.entrySet(); if (pairs == null) return false; Iterator pairsIterator = pairs.iterator(); while (pairsIterator.hasNext()) { Map.Entry keyValuePair = (Map.Entry) (pairsIterator.next()); ArrayList list = (ArrayList) (keyValuePair.getValue()); if (list.contains(value)) return true; } return false; } public void clear() { Set pairs = map.entrySet(); Iterator pairsIterator = pairs.iterator(); while (pairsIterator.hasNext()) { Map.Entry keyValuePair = (Map.Entry) (pairsIterator.next()); ArrayList list = (ArrayList) (keyValuePair.getValue()); list.clear(); } map.clear(); } public Collection values() { ArrayList returnList = new ArrayList(map.size()); Set pairs = map.entrySet(); Iterator pairsIterator = pairs.iterator(); while (pairsIterator.hasNext()) { Map.Entry keyValuePair = (Map.Entry) (pairsIterator.next()); ArrayList list = (ArrayList) (keyValuePair.getValue()); Object[] values = list.toArray(); for (int ii = 0; ii < values.length; ii++) { returnList.add(values[ii]); } } return returnList; } public Object clone() { MultiValueMapImpl obj = new MultiValueMapImpl<V>(); obj.map = (HashMap<Object, ArrayList<V>>) this.map.clone(); return obj; } public int size() { return this.map.size(); } public boolean containsKey(Object key) { return map.containsKey(key); } public Set entrySet() { return map.entrySet(); } public boolean isEmpty() { return map.isEmpty(); } public Set<String> keySet() { return this.map.keySet(); } // remove(K, V) conflicts with a Map method added in 1.8. http://b/27426743 /*public Object remove(String key, V item) { ArrayList<V> list = this.map.get(key); if (list == null) { return null; } else { return list.remove(item); } }*/ public List<V> get(Object key) { return map.get(key); } public List<V> put(String key, List<V> value) { return this.map.put(key,(ArrayList<V>) value); } public List<V> remove(Object key) { return map.remove(key); } public void putAll(Map< ? extends String, ? extends List<V>> mapToPut) { for (String k : mapToPut.keySet()) { ArrayList<V> al = new ArrayList<V>(); al.addAll(mapToPut.get(k)); this.map.put(k, al); } } }