/*
* Copyright (C) 2015 Gerd Petermann
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 or
* version 2 as published by the Free Software Foundation.
*
* 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.
*/
package uk.me.parabola.util;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Set;
public class MultiHashSet<K,V> extends HashMap<K,Set<V>> {
/**
* the empty set to be returned when there is key without values.
*/
private final Set<V> emptyList = Collections.emptySet();
/**
* Returns the list of values associated with the given key.
*
* @param key the key to get the values for.
* @return a list of values for the given keys or the empty list of no such
* value exist.
*/
public Set<V> get(Object key) {
Set<V> result = super.get(key);
return result == null ? emptyList : result;
}
public boolean add(K key, V value ) {
Set<V> values = super.get(key);
if (values == null ) {
values = new LinkedHashSet<V>();
super.put( key, values );
}
return values.add(value);
}
public boolean removeMapping(K key, V value) {
Set<V> values = super.get(key);
if (values == null )
return false;
boolean existed = values.remove(value);
if (values.isEmpty())
super.remove(key);
return existed;
}
}