SetMap extends HashMap<T, Set<V>> { public Set<V> putValue( T key, V value ) { Set<V> set = this.get( key ); set = set == null ? new HashSet<>() : set; set.add( value ); return super.put( key, set ); } SetMap();  SetMap( SetMap<T, V> setMap ); Set<V> putValue( T key, V value ); Set<V> putValues( T key, Set<V> values ); void putValues( SetMap<T, V> setMap ); static SetMap<T, V> getSetMap( Set<V> values, Function<V, T> keyMapper );  }
@Test public void testPutValue() { SetMap<String, Integer> map = new SetMap<>(); map.putValue( "a", 1 ); map.putValue( "a", 2 ); map.putValue( "a", 3 ); map.putValue( "b", 4 ); map.putValue( "b", 5 ); map.putValue( "c", 6 ); assertEquals( Sets.newHashSet( 1, 2, 3 ), map.get( "a" ) ); assertEquals( Sets.newHashSet( 4, 5 ), map.get( "b" ) ); assertEquals( Sets.newHashSet( 6 ), map.get( "c" ) ); }