package org.lttpp.eemory.util;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.ObjectUtils;
public final class MapUtil {
public static <K, V> Map<K, V> map() {
return new HashMap<K, V>();
}
public static <K, V> LinkedHashMap<K, V> orderedMap() {
return new LinkedHashMap<K, V>();
}
public static <K, V> Map<K, V> map(final int initialCapacity) {
return new HashMap<K, V>(initialCapacity);
}
public static <K, V> Map<K, V> map(final Map<? extends K, ? extends V> source) {
return new HashMap<K, V>(source);
}
public static <K, V> Map<K, V> map(final K k, final V v) {
Map<K, V> map = MapUtil.map();
map.put(k, v);
return map;
}
public static <K, V> ConcurrentHashMap<K, V> concurrentMap() {
return new ConcurrentHashMap<K, V>();
}
public static <K, V> SortedMap<K, V> sortedMap() {
return new TreeMap<K, V>();
}
public static <K, V> SortedMap<K, V> sortedMap(final Comparator<K> comparator) {
return new TreeMap<K, V>(comparator);
}
public static <K, V> SortedMap<K, V> sortedMap(final SortedMap<? extends K, ? extends V> source) {
return new TreeMap<K, V>(source);
}
public static <K, V> boolean isEmpty(final Map<K, V> map) {
return map == null || map.isEmpty();
}
public static <K, V> boolean isNull(final Map<K, V> map) {
return map == null;
}
public static boolean isEqualList(final Map<?, ?> map1, final Map<?, ?> map2) {
if (map1 == map2) {
return true;
}
if (isNull(map1) || isNull(map2)) {
return false;
}
if (map1.size() != map2.size()) {
return false;
}
for (Entry<?, ?> e : map1.entrySet()) {
if (!ObjectUtil.isEqualObject(map1.get(e.getKey()), map2.get(e.getKey()))) {
return false;
}
}
return true;
}
public static <K, V> Map<K, V> cloneMap(final HashMap<K, V> source) {
return cloneMap(source, false);
}
public static <K, V> Map<K, V> cloneMap(final HashMap<K, V> source, final boolean deep) {
if (!deep) {
return ObjectUtils.clone(source);
}
if (isNull(source)) {
return null;
}
Map<K, V> map = map(source.size());
for (Entry<K, V> e : source.entrySet()) {
map.put(ObjectUtil.cloneObject(e.getKey(), deep), ObjectUtil.cloneObject(e.getValue(), deep));
}
return map;
}
/**
* The first key that value is matched, preferred to be used when value is
* unique.
*/
public static <K, V> K getKeyByValue(final Map<K, V> map, final V value) {
for (K k : map.keySet()) {
if (map.get(k).equals(value)) {
return k;
}
}
return null;
}
}