43 lines
1.1 KiB
Java
43 lines
1.1 KiB
Java
package tc.oc.commons.core.util;
|
|
|
|
import java.util.Collection;
|
|
import java.util.HashMap;
|
|
import java.util.LinkedHashSet;
|
|
import java.util.Set;
|
|
|
|
import com.google.common.base.Supplier;
|
|
import com.google.common.collect.ForwardingSetMultimap;
|
|
import com.google.common.collect.Multimaps;
|
|
import com.google.common.collect.SetMultimap;
|
|
|
|
/**
|
|
* {@link SetMultimap} that preserves the insertion order of values
|
|
*/
|
|
public class LinkedHashMultimap<K, V> extends ForwardingSetMultimap<K, V> {
|
|
|
|
private final SetMultimap<K, V> delegate = Multimaps.newSetMultimap(
|
|
new HashMap<K, Collection<V>>(),
|
|
new Supplier<Set<V>>() {
|
|
@Override
|
|
public Set<V> get() {
|
|
return new LinkedHashSet<V>();
|
|
}
|
|
}
|
|
);
|
|
|
|
@Override
|
|
protected SetMultimap<K, V> delegate() {
|
|
return delegate;
|
|
}
|
|
|
|
/**
|
|
* Add the given key-value pair to the map, forcing the value to the end
|
|
* of the key's list if it is already present.
|
|
*/
|
|
public boolean force(K key, V value) {
|
|
boolean added = !remove(key, value);
|
|
put(key, value);
|
|
return added;
|
|
}
|
|
}
|