public C remove( K key ) { return getMap().remove( key ); }
public boolean containsKey( K key ) { return getMap().containsKey( key ); }
public Set<Map.Entry<K, C>> getEntries() { return getMap().entrySet(); }
public boolean isEmpty() { return getMap().isEmpty(); }
public Set<K> getKeys() { return getMap().keySet(); }
public boolean hadKey( K key, V value ) { C values = getMap().get( key ); return values != null && values.contains( value ); }
public Set<K> getKeysFor( V value ) { Set<K> results = new HashSet<>(); for( Map.Entry<K, C> entry : getMap().entrySet() ) { if( entry.getValue().contains( value ) ) results.add( entry.getKey() ); } return results; }
@Override public String toString() { final StringBuilder sb = new StringBuilder( "MultiMap{" ); sb.append( "map=" ).append( getMap() ); sb.append( '}' ); return sb.toString(); }
public void addAll( MultiMap<C, K, V> sourceMap ) { if( sourceMap == null ) return; Map<K, C> destinationMap = sourceMap.getMap(); for( Map.Entry<K, C> entry : destinationMap.entrySet() ) addAll( entry.getKey(), entry.getValue() ); }
public C getValues( K key ) { C values = getMap().get( key ); if( values == null ) return emptyCollection(); return values; }
protected C getMultiValues( K key ) { Map<K, C> map = getMap(); C values = map.get( key ); if( values == null ) { values = createCollection(); map.put( key, values ); } return values; }
public C getAllValues( K... keys ) { if( keys.length == 0 ) return emptyCollection(); if( keys.length == 1 ) return getValues( keys[ 0 ] ); C values = createCollection(); for( K key : keys ) { C current = getMap().get( key ); if( current != null ) values.addAll( current ); } return values; }